代码之家  ›  专栏  ›  技术社区  ›  Lukas Bimba

带有默认地图视图接点的Swift Mapview自定义调出视图

  •  2
  • Lukas Bimba  · 技术社区  · 6 年前

    我相信这将是一个非常简单的答案,但我一直在试图找出如何添加带有地图视图默认接点的自定义详图索引视图。在我当前的代码中,我似乎只能添加一个图像作为MKPointAnnotation,而不是默认的pin。第一个“viewFor annotation”是我如何设置默认管脚的,而下面的所有内容都是用于自定义调出视图。。。我想做的是让我的自定义调出视图具有默认的管脚。如果我想要自定义调出视图,是否必须添加自定义图像pin?

    func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
        if annotation is MKUserLocation { return nil }
    
        if let annotationView = mapView.dequeueReusableAnnotationView(withIdentifier: "") {
            annotationView.annotation = annotation
            return annotationView
        } else {
            let annotationView = MKPinAnnotationView(annotation:annotation, reuseIdentifier:"")
            annotationView.isEnabled = true
            annotationView.canShowCallout = true
    
            let btn = UIButton(type: .detailDisclosure)
            annotationView.rightCalloutAccessoryView = btn
            return annotationView
        }
    }
    
    
    func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
    
        if annotation is MKUserLocation { return nil }
        var annotationView = self.mapView.dequeueReusableAnnotationView(withIdentifier: "Pin")
        if annotationView == nil{
            annotationView = CustomBusinessCallOutAnnotatiion(annotation: annotation, reuseIdentifier: "Pin")
            annotationView?.canShowCallout = false
        }else{
            annotationView?.annotation = annotation
        }
        annotationView?.image = UIImage(named: "car")
        return annotationView
    }
    
    func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView) {
    
        if view.annotation is MKUserLocation { return }
    
        let customAnnotation = view.annotation as! CustomBusinessPoint
        let views = Bundle.main.loadNibNamed("CustomBusinessCallOut", owner: nil, options: nil)
        let calloutView = views?[0] as! CustomBusinessCallOut
    
    
        calloutView.businessName.text = customAnnotation.businessName
        calloutView.businessStreet.text = customAnnotation.businessStreet
        calloutView.businessState.text = customAnnotation.businessState
        calloutView.businessDistance.text = customAnnotation.businessDistance
    
    
        calloutView.center = CGPoint(x: view.bounds.size.width / 2, y: -calloutView.bounds.size.height * -0.0001)
        view.addSubview(calloutView)
        mapView.setCenter((view.annotation?.coordinate)!, animated: true)
    }
    
    func mapView(_ mapView: MKMapView, didDeselect view: MKAnnotationView) {
        if view.isKind(of: CustomBusinessCallOutAnnotatiion.self) {
            for subview in view.subviews {
                subview.removeFromSuperview()
            }
        }
    }
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   Kosuke Ogawa    6 年前

    您不需要添加子视图calloutView。你可以用 MKAnnotationView 作为自定义标注。

    例如 您应该整理源代码

    MKAnnotation MKAnnotationView

    class PinAnnotation : NSObject, MKAnnotation {
        var coordinate : CLLocationCoordinate2D
        var title: String?
        var calloutAnnotation: CustomBusinessCallOut?
    
        init(location coord:CLLocationCoordinate2D) {
            self.coordinate = coord
            super.init()
        }
    }
    
    class CustomBusinessCallOut : NSObject, MKAnnotation {
        var coordinate: CLLocationCoordinate2D
        var title: String?
    
        init(location coord:CLLocationCoordinate2D) {
            self.coordinate = coord
            super.init()
        }
    }
    
    class CalloutAnnotationView : MKAnnotationView {
    }
    

    实现mapView委托方法。

    func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
        if annotation is MKUserLocation {
            return nil
        }
    
        if annotation is PinAnnotation {
            let reuseId = "Pin"
            var pinView = mapView.dequeueReusableAnnotationView(withIdentifier: reuseId) as? MKPinAnnotationView
            if pinView == nil {
                pinView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: reuseId)
            }
            else {
                pinView?.annotation = annotation
            }
    
            return pinView
        } else if annotation is CustomBusinessCallOut {
            let reuseId = "Callout"
            var pinView = mapView.dequeueReusableAnnotationView(withIdentifier: reuseId)
            if pinView == nil {
                pinView = CalloutAnnotationView(annotation: annotation, reuseIdentifier: reuseId)
                pinView?.addSubview(UIImageView(image: UIImage(named: "car")))
            }
            else {
                pinView?.annotation = annotation
            }
    
            return pinView
        } else {
            return nil
        }
    }
    
    func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView) {
        guard view.annotation is PinAnnotation else { return }
        if let pinAnnotation = view.annotation as? PinAnnotation {
            let calloutAnnotation = CustomBusinessCallOut(location: pinAnnotation.coordinate)
            calloutAnnotation.title = pinAnnotation.title
            pinAnnotation.calloutAnnotation = calloutAnnotation
            mapView.addAnnotation(calloutAnnotation)
        }
    }
    
    func mapView(_ mapView: MKMapView, didDeselect view: MKAnnotationView) {
        guard view.annotation is PinAnnotation else { return }
        if let pinAnnotation = view.annotation as? PinAnnotation,
            let calloutAnnotation = pinAnnotation.calloutAnnotation {
            mapView.removeAnnotation(calloutAnnotation)
            pinAnnotation.calloutAnnotation = nil
        }
    }