오늘은 MKMapView를 활용하는 방법에 대해 간단하게 정리해보고자 합니다!
현재 사용하고자 하는 View의 구성은 다음과 같습니다!
지도를 보여주는 mapView만 간단하게 추가해놓은 상태입니다.
이때 mapView의 타입은 UIView가 아닌 MKMapView이기 때문에 코드에
import MapKit
을 꼭 추가해줘야 합니다.
let location = CLLocationCoordinate2D(latitude: 37.5030042, longitude: 127.0507571)
let span = MKCoordinateSpan(latitudeDelta: 0.1, longitudeDelta: 0.1)
let region = MKCoordinateRegion(center: location, span: span)
mapView.setRegion(region, animated: true)
let annotation = MKPointAnnotation()
annotation.title = "HERE!!!!"
annotation.coordinate = location
mapView.addAnnotation(annotation)
mapView.delegate = self
현재 MapView에 보이는 지역을 변경하고 싶을 때 사용하는 메서드가 setRegion
입니다.
이때 필요한 매개변수는 MKCoordinateRegion
타입으로 변경하고 싶은 지역의 좌표 정보가 포함돼있어야 합니다.
따라서 원하는 좌표 정보를 담은 MKCoordinateRegion 인스턴스를 생성해줘야합니다.
MKCoordinateRegion은 struct로 특정 경도와 위도를 중심으로 둘러싼 사각형 모양의 지역범위를 표시하고 있습니다.
다양한 방식으로 초기화를 시켜줄 수 있지만 init(center:span:)
을 사용해보고자 합니다.
이때 center는 CLLocationCoordinate2D
타입, span은 MKCoordinateSpan
타입입니다. 해당 타입들에 대해서 자세히 알아보겠습니다.
The latitude and longitude associated with a location, specified using the WGS 84 reference frame.
CLLocationCoordinate2D는 WGS 84 reference 프레임을 사용하여 지정된 위치와 관련된 위도 및 경도 데이터입니다. 이때 WGS 84 reference 프레임이 뭔지는 아직 모르겠지만...
init(latitude:longitude:)
초기화 함수를 보니 위도 및 경도 데이터를 이 struct를 활용하여 저장할 수 있는 것으로 보입니다.
let location = CLLocationCoordinate2D(latitude: 37.5176577, longitude: 126.8842201)
이렇게 초기화 함수를 사용하여 위치 데이터를 프로퍼티에 할당해주었습니다!
MKCoordinateSpan은 우리가 지정해주고자 하는 지역 범위의 폭과 너비를 정해줄 수 있는 struct입니다. 지도의 zoom level을 정할 수 있다고 보면 되는데요 value가 작아질 수록 higher zoom level이 된다고 하니 값이 작을수록 더 확대돼서 보인다고 생각할 수 있습니다.
init(latitudeDelta:longitudeDelta:)
초기화 메서드를 사용해보고자 하는데 이때 각 deltaValue의 타입은 CLLocationDegrees
입니다.
CLLocationDegrees
는 Type Alias로 새로 정의된 타입인데 기존에는 Double 타입이었으며 도(?) 단위로 명시된 위도 혹은 경도값입니다. 따라서 초기화 구문안에는 Double값을 작성해주면 span값이 결정됩니다.
원하는 정도의 zoom level에 맞게 작성해주면 되는데 이때 어느정도의 값이 어느정도의 확대가 되는지 확인해보기 위해 3가지 경우를 확인해봤습니다.
let span = MKCoordinateSpan(latitudeDelta: 1, longitudeDelta: 1)
let span = MKCoordinateSpan(latitudeDelta: 0.1, longitudeDelta: 0.1)
let span = MKCoordinateSpan(latitudeDelta: 0.001, longitudeDelta: 0.001)
값이 작아질수록 현재 위치의 정확도가 높아지는 것을 확인할 수 있습니다. 구현할 때 원하는 정도의 zoom level에 맞게 값을 할당해주면 될 것 같습니다!
이렇게 setRegion
메서드에 들어가는 location
과 span
에 대해 모두 알아봤으니 region 프로퍼티를 생성할 수 있습니다.
let location = CLLocationCoordinate2D(latitude: 37.5176577, longitude: 126.8842201)
let span = MKCoordinateSpan(latitudeDelta: 0.01, longitudeDelta: 0.01)
let region = MKCoordinateRegion(center: location, span: span)
그 후 MapView에 setRegion을 통해 지역을 설정해주면 원하는 지역이 뜨는 것을 확인할 수 있습니다.
mapView.setRegion(region, animated: true)
지도의 정확한 위치에 핀 및 문자열(title)을 추가하고 싶을 때 사용하는 class입니다.
let annotation = MKPointAnnotation()
annotation.title = "HERE!!!!"
annotation.coordinate = location
mapView.addAnnotation(annotation)
그런 뒤 실행을 해보면 다음과 같이 좌표가 찍힌 것을 확인할 수 있습니다!
MKMapView Class는 특정 작업이 완료되는 경우 delegate를 통해 알리게 됩니다. 따라서 mapView와 상호작용을 하기 위해서는 Delegate 연결을 해줘야합니다.
mapView.delegate = self
다음과 같이 연결을 해준 뒤 extension을 통해 viewController과 MKMapViewDelegate 프로토콜을 채택하도록 해줍니다.
extension LocationViewController: MKMapViewDelegate {
func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView) {
print("here~~~~")
}
}
다음 메서드를 입력해주면 우리가 원하는 위치에 추가한 annotation을 클릭할 때 마다 디버그 영역에 here가 출력되는 것을 볼 수 있습니다!
뒤에 바로 이어서 Location Privacy & Authorization 관련해서 알아보도록 하겠습니다!