우선, Xcode 프로젝트에서 MapKit 프레임워크를 추가해야 합니다.
지도를 표시하려면 MKMapView를 사용합니다. ViewController에 지도를 추가하고, 원하는 위치로 지도를 이동시켜 보겠습니다.
import UIKit
import MapKit
class ViewController: UIViewController {
private var mapView: MKMapView!
override func viewDidLoad() {
super.viewDidLoad()
// MKMapView 초기화 및 뷰에 추가
mapView = MKMapView(frame: self.view.bounds)
self.view.addSubview(mapView)
// 지도의 중심 좌표와 줌 레벨 설정
let center = CLLocationCoordinate2D(latitude: 37.7749, longitude: -122.4194) // San Francisco, CA
let region = MKCoordinateRegion(center: center, span: MKCoordinateSpan(latitudeDelta: 0.05, longitudeDelta: 0.05))
mapView.setRegion(region, animated: true)
}
}
지도에 사용자의 현재 위치를 표시하려면 두 가지 단계를 거쳐야 합니다.
사용자 위치 접근 권한 요청:
Info.plist 파일에 NSLocationWhenInUseUsageDescription 키를 추가하고 사용자에게 위치 접근 권한을 요청하는 메시지를 입력합니다.
지도에 사용자 위치 표시:
mapView.showsUserLocation = true
let annotation = MKPointAnnotation()
annotation.coordinate = CLLocationCoordinate2D(latitude: 37.7749, longitude: -122.4194) // San Francisco, CA
annotation.title = "San Francisco"
annotation.subtitle = "CA"
mapView.addAnnotation(annotation)
사용자가 입력한 텍스트를 기반으로 위치를 검색하는 기능을 추가해보겠습니다.
func searchLocation(named name: String) {
let searchRequest = MKLocalSearch.Request()
searchRequest.naturalLanguageQuery = name
let search = MKLocalSearch(request: searchRequest)
search.start { (response, error) in
guard let response = response else {
print("Error: \(error?.localizedDescription ?? "Unknown error")")
return
}
// 검색 결과에서 첫 번째 위치를 지도의 중심으로 설정
let firstLocation = response.mapItems.first?.placemark.coordinate
if let location = firstLocation {
let region = MKCoordinateRegion(center: location, span: MKCoordinateSpan(latitudeDelta: 0.05, longitudeDelta: 0.05))
self.mapView.setRegion(region, animated: true)
}
}
}
두 위치 사이의 경로를 찾는 기능도 추가할 수 있습니다. 이 기능은 특히 내비게이션 앱에서 유용하게 사용됩니다.
func findRoute(from source: CLLocationCoordinate2D, to destination: CLLocationCoordinate2D) {
let sourcePlacemark = MKPlacemark(coordinate: source)
let destinationPlacemark = MKPlacemark(coordinate: destination)
let directionRequest = MKDirections.Request()
directionRequest.source = MKMapItem(placemark: sourcePlacemark)
directionRequest.destination = MKMapItem(placemark: destinationPlacemark)
directionRequest.transportType = .automobile
let directions = MKDirections(request: directionRequest)
directions.calculate { (response, error) in
guard let response = response else {
print("Error: \(error?.localizedDescription ?? "Unknown error")")
return
}
// 경로 표시
let route = response.routes[0]
self.mapView.addOverlay(route.polyline, level: .aboveRoads)
}
}
// MKMapViewDelegate 메서드를 사용하여 경로 스타일 지정
func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
if overlay is MKPolyline {
let renderer = MKPolylineRenderer(overlay: overlay)
renderer.strokeColor = UIColor.blue
renderer.lineWidth = 3.0
return renderer
}
return MKOverlayRenderer()
}