iOS开发Swift

IOS MapKit 地图拖拽 缩放的事件

拖拽地图

当我们用MapKit开发时,有时候希望在地图拖拽时触发事件,可以用下面的方法。

struct MapView: UIViewRepresentable {

    func makeUIView(context: Context) -> MKMapView {
        let mapView = MKMapView()
        mapView.delegate = context.coordinator
        mapView.showsBuildings = true
        mapView.showsScale = true
        mapView.isPitchEnabled = true
        mapView.showsUserLocation = true

        let region = MKCoordinateRegion(center: CLLocationCoordinate2DMake(35.292899, 140.085370), span: MKCoordinateSpan(latitudeDelta: 0.75, longitudeDelta: 0.75))
        mapView.setRegion(region, animated: true)

        return mapView
    }

    func updateUIView(_ uiView: MKMapView, context: UIViewRepresentableContext<MapView>) {

    }

    func makeCoordinator() -> Coordinator {
        Coordinator(self)
    }

    class Coordinator: NSObject, MKMapViewDelegate, UIGestureRecognizerDelegate {

        var parent: MapView
        var mkMapView: MKMapView?

        init(_ parent: MapView) {
            self.parent = parent

        }

        func mapViewDidFinishLoadingMap(_ mapView: MKMapView) {
            self.mkMapView = mapView
        }

        func mapView(_ mapView: MKMapView, didUpdate userLocation: MKUserLocation) {
        }

        // 地图图钉選択場合動作
        func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView) {

        }

        // ※拖拽地图时触发
        func mapView(_ mapView: MKMapView, regionDidChangeAnimated animated: Bool) {
            // 这里做些自定义的操作,比如重画某些图钉之类的。
            drawCenterPoint(mapView)
        }
        
        // ※拖拽地图时触发
        func mapView(_ mapView: MKMapView, regionWillChangeAnimated animated: Bool) {
            drawCenterPoint(mapView)
        }

        // 自定义图钉做成
        func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
            guard annotation is MKPointAnnotation else { return nil }

            let identifier = "Annotation" + String(arc4random())
            var annotationView = mapView.dequeueReusableAnnotationView(withIdentifier: identifier)
            if annotationView == nil {
                annotationView = MKAnnotationView(annotation: annotation, reuseIdentifier: identifier)
            } else {
                annotationView!.annotation = annotation
            }

            let image = UIImage(named: "\(annotation.annotationType)")!
            annotationView!.image = image.scaleImage(scaleSize: annotation.iconScaleSize)
            if annotation.annotationType == "Center Point" {
                let offset = CGPoint(x: 0, y: -(image.size.height / 2))
                annotationView!.centerOffset = offset
            }

            let nameLbl: UILabel! = UILabel(frame: CGRect(x: -24, y: 40, width: 100, height: 30))
            nameLbl.text = "自由文本"
            nameLbl.textColor = UIColor.black
            nameLbl.font = UIFont(name: "Atari Classic Extrasmooth", size: 10)
            nameLbl.textAlignment = NSTextAlignment.center
            annotationView!.addSubview(nameLbl)


            annotationView!.displayPriority = .required
            return annotationView
        }

        func drawCenterPoint(_ uiView: MKMapView) {

            for annotation_loop in uiView.annotations {
                if annotation_loop is MKUserLocation {
                    continue
                }

                if annotation_loop.annotationType == "Center Point" {
                    uiView.removeAnnotation(annotation_loop)
                    break;
                }

            }
            let annotation = MKPointAnnotation()
            annotation.annotationID = String("001")
            annotation.annotationType = "Center Point"
            annotation.iconScaleSize = 0.25
            annotation.title = "123"
            annotation.latitude = String(uiView.region.center.latitude)
            annotation.longitude = String(uiView.region.center.longitude)
            annotation.coordinate = CLLocationCoordinate2DMake(uiView.region.center.latitude, uiView.region.center.longitude)
            uiView.addAnnotation(annotation)
        }
    }
}