地图视图的自定义注释 Swift

Custom Annotation for Mapview Swift

我查看了相关帖子,但仍然没有收到自定义图钉....

自定义注释 --> 这包括设置我的图像

 import UIKit
 import MapKit

 class CustomPointAnnotation: MKPointAnnotation {
     var pinCustomImageName: UIImage!
 }

视图控制器:

我想return当前位置,直到选择一个按钮来放置图钉

func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
    //current Location
    if !(annotation is CustomPointAnnotation) {
        return nil
    }
    let reuseIdentifier = "pin"
    var annotationView = mapView.dequeueReusableAnnotationView(withIdentifier: reuseIdentifier)
    if annotationView == nil {
        annotationView = MKAnnotationView(annotation: annotation, reuseIdentifier: reuseIdentifier)
        annotationView!.canShowCallout = true
        
    } else {
        annotationView!.annotation = annotation
    }
    if let annotationView = annotationView {
        annotationView.image = UIImage(named: "Skyscraper")
        annotationView.canShowCallout = true
    }
   
    return annotationView
}

func addPin() {
    pointAnnotation = CustomPointAnnotation()
    pointAnnotation.pinCustomImageName = UIImage(named: "Skyscraper")
    pointAnnotation.coordinate = currentLocation.coordinate
    pointAnnotation.title = "First Building"
    pointAnnotation.subtitle = "Latitude: \(currentLocation.coordinate.latitude), \ 
     (currentLocation.coordinate.longitude)"
    mapView.addAnnotation(pointAnnotation)
}

代码没有严重错误。但是可能有一些事情会导致问题,包括:

  1. 您是否为地图视图设置了 delegate(在 IB 中或以编程方式)?否则,您的 mapView(_:viewFor:) 将永远不会被调用。添加断点或调试print语句确认。

  2. 您确认 UIImage(named: "Skyscraper") 正在成功检索图像吗?确保这不会返回 nil.


注意,如果只是iOS11及以后的版本,可以稍微简化一下这段代码。自 iOS 11 以来,我们不再需要 mapView(_:viewFor:) 在这样的简单场景中。我建议将注释视图配置代码放在注释视图 subclass 中,并避免使用 viewFor 实现使我们的视图控制器混乱。

因此,当您确实解决了当前问题时,建议的流程是:

  1. 为您的注释和注释视图定义 classes:

    class CustomAnnotation: MKPointAnnotation {
        var pinCustomImage: UIImage!
    }
    

    class CustomAnnotationView: MKAnnotationView {
        override init(annotation: MKAnnotation?, reuseIdentifier: String?) {
            super.init(annotation: annotation, reuseIdentifier: reuseIdentifier)
            canShowCallout = true
            update(for: annotation)
        }
    
        override var annotation: MKAnnotation? { didSet { update(for: annotation) } }
    
        required init?(coder aDecoder: NSCoder) {
            fatalError("init(coder:) has not been implemented")
        }
    
        private func update(for annotation: MKAnnotation?) {
            image = (annotation as? CustomAnnotation)?.pinCustomImage
        }
    }
    
  2. viewDidLoad注册这个注解视图class:

    mapView.register(CustomAnnotationView.self, forAnnotationViewWithReuseIdentifier: MKMapViewDefaultAnnotationViewReuseIdentifier)
    
  3. 删除 mapView(_:viewFor:) 实现。

现在,当您将 CustomAnnotation 添加到地图的注释列表时,它会正确呈现。

但我建议先解决您当前的问题。在解决这些更基本的问题之前,没有必要改进您的实施。