Swift 3.0 Map viewForAnnotation未输出正确的标注

时间:2017-07-26 14:43:45

标签: ios swift mkmapview mkannotation mkannotationview

我无法理解viewForAnnotation方法的代码以及何时调用它。我的目的是根据引脚颜色的颜色显示特定的标注。首次加载mapView时,标注会正确显示,但在切换视图控制器后,根据引脚颜色无法正确显示标注按钮。我有一个预感,这可能与调用viewForAnnotation时有关(无论是否每次出现地图时都会调用它)。我无法弄清楚出了什么问题,因为我不确定代码的每个部分是做什么的。

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

if (annotation is MKUserLocation) {

    return nil
}

let identifier = "pinAnnotation"


// In particular I am not sure what the code below does

if let pin = annotation as? ColorPointAnnotation {


    if let view = map.dequeueReusableAnnotationView(withIdentifier: identifier) as? MKPinAnnotationView {
        view.annotation = annotation
        view.pinTintColor = pin.color ?? .purple

        return view

    } else {

        let view = MKPinAnnotationView(annotation: annotation, reuseIdentifier: identifier)
        view.isEnabled = true

        view.canShowCallout = true

        view.pinTintColor = pin.color ?? .purple

        let btn = UIButton(type: .detailDisclosure)
        view.rightCalloutAccessoryView = btn


        if view.pinTintColor == .red || view.pinTintColor == .green {
            let button = UIButton(frame: CGRect(x: 0, y: 0, width: 30, height: 30))
            button.setBackgroundImage(UIImage(named: "car"), for: .normal)
            button.addTarget(self, action: #selector(MapVC.getDirections), for: .touchUpInside)
            view.leftCalloutAccessoryView = button
        } else {
            let button = UIButton(frame: CGRect(x: 0, y: 0, width: 30, height: 30))
            button.setBackgroundImage(UIImage(named: "other"), for: .normal)
            button.addTarget(self, action: #selector(MapVC.other), for: .touchUpInside)
            view.leftCalloutAccessoryView = button
        }

        return view
    }
}

if let annotationView = map.dequeueReusableAnnotationView(withIdentifier: identifier) {
    annotationView.annotation = annotation
    return annotationView
} else {
    let annotationView = MKPinAnnotationView(annotation:annotation, reuseIdentifier: identifier)
    annotationView.isEnabled = true
    annotationView.canShowCallout = true

    let btn = UIButton(type: .detailDisclosure)
    annotationView.rightCalloutAccessoryView = btn

    if annotationView.pinTintColor == .red || annotationView.pinTintColor == .green {

        let smallSquare = CGSize(width: 120, height: 120)
        let button = UIButton(frame: CGRect(origin: CGPoint(x: 0,y :0), size: smallSquare))
        button.setBackgroundImage(UIImage(named: "car"), for: .normal)
        button.addTarget(self, action: #selector(MapVC.getDirections), for: .touchUpInside)
        annotationView.leftCalloutAccessoryView = button
    } else {
        let button = UIButton(frame: CGRect(x: 0, y: 0, width: 30, height: 30))
        button.setBackgroundImage(UIImage(named: "other"), for: .normal)
        button.addTarget(self, action: #selector(MapVC.other), for: .touchUpInside)
        annotationView.leftCalloutAccessoryView = button
    }

    return annotationView
}

}

1 个答案:

答案 0 :(得分:1)

方法func mapView(_ map: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView?MapViewDelegate的委托方法,每次mapView在Region中显示Annotation时都会执行此方法,如果实现,则可以显示{{1}的任何子类在地图中作为annotationView,要显示自定义标注,您需要实现annotationView

的此方法
MapViewDelegate

希望这有助于你