MKMarkerAnnotationView不显示标注

时间:2019-11-22 07:14:39

标签: ios swift annotations mapkit callouts

我目前正在为通过MapKit添加到地图视图中的注释创建标注。注释效果很好,但是即使我使用正确的代码启用标注,目前也没有显示标注。

HERE是我的viewFor annotation代码块。

func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {

    if annotation is MKUserLocation {
        return nil
    }

    if let annotation = annotation as? ClusterAnnotation {
        let identifier = "cluster"
        return mapView.annotationView(annotation: annotation, reuseIdentifier: identifier)
    } else {
        let identifier = "pin"

        let annotationView = mapView.annotationView(of: MKMarkerAnnotationView.self, annotation: annotation, reuseIdentifier: identifier)
        annotationView.isEnabled = true
        annotationView.canShowCallout = true
        annotationView.accessibilityLabel = "hi"
        annotationView.isHidden = false
        annotationView.rightCalloutAccessoryView = UIButton(type: .detailDisclosure)
        annotationView.markerTintColor = UIColor.customBlue()
        annotationView.glyphImage = UIImage(named: "person")
        return annotationView
    }
}

annotationView函数的扩展代码块。

extension MKMapView {
    func annotationView<T: MKAnnotationView>(of type: T.Type, annotation: MKAnnotation?, reuseIdentifier: String) -> T {
        guard let annotationView = dequeueReusableAnnotationView(withIdentifier: reuseIdentifier) as? T else {
            return type.init(annotation: annotation, reuseIdentifier: reuseIdentifier)
        }
        annotationView.annotation = annotation
        return annotationView
    }
}

当我选择注释时,注释会放大,并且在didSelect代码块中,它将运行我在其中运行的打印语句。即使我确实启用了几乎所有功能,也不能完全确定发生了什么事,这还是不允许标注显示。

1 个答案:

答案 0 :(得分:1)

请使用此代码。 这段代码对我来说很好用。 该代码支持Swift4和Swift5。

func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {

    //  Don't want to show a custom image if the annotation is the user's location.
    if (annotation is MKUserLocation) {
        return nil
    } else {

        let annotationIdentifier = "AnnotationIdentifier"
        let nibName = "MyAnnotationView" //My XIB Name
        let viewFromNib = Bundle.main.loadNibNamed(nibName, owner: self, options: nil)?.first as! MyAnnotationView // get My XIB
        var annotationView: MyAnnotationView?

        // if there is a view to be dequeued, use it for the annotation
        if let dequeuedAnnotationView = mapView.dequeueReusableAnnotationView(withIdentifier: annotationIdentifier) as? MyAnnotationView {

            if dequeuedAnnotationView.subviews.isEmpty {
                dequeuedAnnotationView.addSubview(viewFromNib)
            }
            annotationView = dequeuedAnnotationView
            annotationView?.annotation = annotation
        } else {

            // if no views to dequeue, create an Annotation View
            let av = MyAnnotationView(annotation: annotation, reuseIdentifier: annotationIdentifier)
            av.addSubview(viewFromNib)
            annotationView = av     // extend scope to be able to return at the end of the func
        }

        // after we manage to create or dequeue the av, configure it
        if let annotationView = annotationView {
            annotationView.canShowCallout = true                                    // callout bubble
            annotationView.rightCalloutAccessoryView = UIButton(type: .detailDisclosure)
            annotationView.frame = CGRect(x: 0, y: 0, width: 75, height: 80)

            let customView = annotationView.subviews.first as! MyAnnotationView
            customView.frame = annotationView.frame

        }
        return annotationView
    }
}

此代码输出:

enter image description here

很高兴为您服务。