June's Story

[SwiftUI] MapKit에서 Long Press Gesture 위치 출력 본문

프로그래밍

[SwiftUI] MapKit에서 Long Press Gesture 위치 출력

Ikjunerd Ikjunerd 2019. 10. 20. 18:54

MapKit 기반 iOS앱을 만들 계획으로 Swift언어랑 SwiftUI 공부한 내용 공유합니다.

개선 필요한 부분 있으면 알려주세요~

 

Long press 위치의 화면 픽셀 좌표를 받아서 맵의 위도 경도 좌표로 변환하는 코드입니다.

Long press 제스쳐를 통해서 화면 좌표를 받을 수 없는것 같아서 Long press 이후에 drag 제스쳐를 추가하고 drag 위치를 long press 된 위치로 보고 받아서 변환했습니다.

위 두개 제스쳐를 추가하니 맵 패닝이 안되서 그 앞에 먼저 drag 제스쳐를 추가했습니다. 

 

ContentView.Swift

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import SwiftUI
import MapKit
 
struct ContentView : View {
    @State private var longPressLocation: CGPoint = .zero //long press 위치 저장
    @State private var isLongPressed: Bool = false
    
    let drag = DragGesture() //맵 패닝은 작동하도록 추가
    
    var body: some View {
        let longPress = LongPressGesture(minimumDuration: 0.5, maximumDistance: 5).sequenced(
            before: DragGesture(minimumDistance: 0)).onEnded{ (value) in
            guard case .second(let isLongPressed, let drag?) = value else { return }
            self.longPressLocation = drag.location
            self.isLongPressed = isLongPressed
            
        }
        return MapView(
            longPressViewLocation: $longPressLocation, 
            isLongPressed: $isLongPressed).gesture(drag).gesture(longPress)
    }
}
cs

 

Long Press가 완료되면 ContentView의 State 변수를 업데이트하고 State 변수 업데이트에 따라서 MapView struct의 updateUIView가 호출, 바인딩 변수 longPressViewLocation으로 받은 화면 좌표를 MapKit의 convert함수로 위도 경도 좌표로 변환하여 출력합니다.

 

MapView.Swift

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import SwiftUI
import MapKit
 
struct MapView : UIViewRepresentable {
    
    func makeUIView(context: Context) -> MKMapView {
        let view = MKMapView(frame: .zero)
        let coordinate = CLLocationCoordinate2D(latitude: 35.722303, longitude: 126.672231)
        let span = MKCoordinateSpan(latitudeDelta: 0.2, longitudeDelta: 0.2)
        let region = MKCoordinateRegion(center: coordinate, span: span)
        view.setRegion(region, animated: true)
        view.delegate = context.coordinator
        return view
    }
 
    func updateUIView(_ view: MKMapView, context: Context) {
        print(view.convert(self.longPressViewLocation, toCoordinateFrom: view))       
    }
    
    @Binding var longPressViewLocation: CGPoint
    @Binding var isLongPressed: Bool
}
cs

 

 

0 Comments
댓글쓰기 폼