注释图钉颜色和类型

问题描述 投票:0回答:1

我的应用程序具有向地图添加注释的方法

 var annotationArray = [MyAnnotation]()
 var allAnnotations: [(objLat: CLLocationDegrees, objLong: CLLocationDegrees, objName: String, objDesc: String, objId: String)] = []

  func addAnnotationsToMap() {
    annotationArray = []
        for oneObject in self.allAnnotations {
            let oneAnnotation = MyAnnotation()
            let oneObjLoc: CLLocationCoordinate2D = CLLocationCoordinate2DMake(oneObject.objLat, oneObject.objLong)
            oneAnnotation.coordinate = oneObjLoc
            oneAnnotation.title = oneObject.objName
            oneAnnotation.subtitle = oneObject.objDesc
            oneAnnotation.mapId = oneObject.objId

            self.annotationArray.append(oneAnnotation)
        }
        self.map.addAnnotations(self.annotationArray)
        self.allAnnotations = []
        self.annotationArray = []
   }

MyAnnotation是

import UIKit
import MapKit

class MyAnnotation: MKPointAnnotation {
    var mapId = String()
    var phone1 = String()
    var phone2 = String()
    var specialty1 = String()
    var specialty2 = String()
}

取决于special1的类型,我想使用不同的图钉颜色(和类型),我正在尝试使用以下方法。停止显示的一件事是Pin标题很难(这是我想保留的内容)

func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
    let annotationView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: nil)

    annotationView.pinTintColor = UIColor.red

    return annotationView
}

我的想法是使用下面的别针使用不同的颜色

Pin

如果删除viewFor注释,则会得到带有标题的图钉。

[有几篇文章显示了如何为注释添加不同的颜色,但是它们都使用addAnnotation而不是addAnnotations。

我想念的是什么?有什么方法可以满足我的需求?

谢谢

ios swift annotations mapkit
1个回答
0
投票
MKPinAnnotationView未在图钉下显示名称。仅当您点击它并显示标注时,它才会显示。

如果要在其下方使用这种样式的圆形注释视图,请使用MKMarkerAnnotationView。要更改其颜色,请设置markerTintColor


顺便说一句,我不建议像这样直接实例化注释视图。

我建议在viewDidLoad中注册一个重用ID:

mapView.register(MKMarkerAnnotationView.self, forAnnotationViewWithReuseIdentifier: MKMapViewDefaultAnnotationViewReuseIdentifier)

然后,在viewFor中,您可以像这样使出一个可重用的注释视图出队:

let view = mapView.dequeueReusableAnnotationView(withIdentifier: MKMapViewDefaultAnnotationViewReuseIdentifier, for: annotation) as! MKMarkerAnnotationView view.markerTintColor = ...

当您可以开始重新使用批注视图时,此方法效率更高。


[现在,我要更进一步,将viewFor完全删除,然后将注释视图的配置放在它所属的注释视图类中。 (这就是我们使用MKMapViewDefaultAnnotationViewReuseIdentifier的原因。)

例如,我将继承MKMarkerAnnotationView

class MyAnnotationView: MKMarkerAnnotationView { override var annotation: MKAnnotation? { didSet { update(for: annotation) } } override init(annotation: MKAnnotation?, reuseIdentifier: String?) { super.init(annotation: annotation, reuseIdentifier: reuseIdentifier) update(for: annotation) } required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) } } private extension MyAnnotationView { func update(for annotation: MKAnnotation?) { guard let annotation = annotation as? MyAnnotation else { return } markerTintColor = ... } }

然后在viewDidLoad中注册此注释视图:

mapView.register(MyAnnotationView.self, forAnnotationViewWithReuseIdentifier: MKMapViewDefaultAnnotationViewReuseIdentifier)

但是在这种模式下,您根本不会实现viewFor。仅当您具有多个自定义注释重用标识符时,才需要这样做。
© www.soinside.com 2019 - 2024. All rights reserved.