重复使用注释视图mapkit swift 4时,为什么我的标签文本没有改变

时间:2018-06-17 18:41:49

标签: swift mkannotationview

我正在使用mapkit在注释上方显示带有注释名称标签的某些地方的自定义注释。我注意到,在重新创建/重用几个注释后,标签中的文本与注释的名称不同。我认为当重复使用注释时,标题不会被更改。重复使用的注释越多,它们的标题就越多。

为什么标签的标题在重复使用时与标题的标题不匹配?

这是我的代码:

func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
    if annotation is MKUserLocation { return nil }

    var annotationView = mapView.dequeueReusableAnnotationView(withIdentifier: "pin") as? MKPinAnnotationView

    let annotationLabel = UILabel(frame: CGRect(x: -40, y: -35, width: 105, height: 30))
    annotationLabel.numberOfLines = 3
    annotationLabel.textAlignment = .center
    annotationLabel.font = UIFont(name: "Rockwell", size: 10)

    let strokeTextAttributes: [NSAttributedStringKey: Any] = [
        .strokeColor : UIColor.white,
        .foregroundColor : UIColor.black,
        .strokeWidth : -4,
        ]

    if annotationView == nil {
        annotationView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: "pin")
        annotationView?.animatesDrop = true
        annotationView?.canShowCallout = false

        annotationLabel.attributedText = NSMutableAttributedString(string: annotation.title!!, attributes: strokeTextAttributes)
        annotationView?.addSubview(annotationLabel)
    } else {
        annotationView?.annotation = annotation
        annotationLabel.attributedText = NSMutableAttributedString(string: annotation.title!!, attributes: strokeTextAttributes)
    }


    annotationLabel.clipsToBounds = true
    annotationLabel.backgroundColor = UIColor.white
    annotationLabel.layer.cornerRadius = 15

    return annotationView
}

因此,您可以看到标签的文本应该更改为标签的标题,因为无论是否已经创建,我都会将文本更改为当前注释。

以下是一些可以获得更好主意的图片: Annotation before being reused

Annotation after being reused

Actual annotation name

正如您所见,“Luna Blu”是Tiburon的一家餐厅。在需要更多注释并重复使用注释之后,它说“Luna Blu”位于城市中心。为了表明这实际上是不正确的,当我点击注释时,会出现一个带有真实注释标题的滑出菜单,即“Taylor Street Coffee Shop”。

1 个答案:

答案 0 :(得分:2)

当注释不是nil并且控制转到else时,标签的标题被更改但是它不是添加到annotationView的标签,它是将被解除分配的本地变量。 func返回

annotationLabel.attributedText = NSMutableAttributedString(string: annotation.title!!, attributes: strokeTextAttributes)

所以你必须查询该标签的视图,可以通过你在添加之前给它的标签并为其分配文本

//

func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
    if annotation is MKUserLocation { return nil }

    var annotationView = mapView.dequeueReusableAnnotationView(withIdentifier: "pin") as? MKPinAnnotationView

    let annotationLabel = UILabel(frame: CGRect(x: -40, y: -35, width: 105, height: 30))
    annotationLabel.numberOfLines = 3
    annotationLabel.textAlignment = .center
    annotationLabel.font = UIFont(name: "Rockwell", size: 10)
    annotationLabel.tag = 22
    let strokeTextAttributes: [NSAttributedStringKey: Any] = [
        .strokeColor : UIColor.white,
        .foregroundColor : UIColor.black,
        .strokeWidth : -4,
        ]

    if annotationView == nil {
        annotationView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: "pin")
        annotationView?.animatesDrop = true
        annotationView?.canShowCallout = false

        annotationLabel.attributedText = NSMutableAttributedString(string: annotation.title!!, attributes: strokeTextAttributes)
        annotationView?.addSubview(annotationLabel)
    } else {
        annotationView?.annotation = annotation

        for item in annotationView!.subviews {
           if item.tag == 22 {
               let lbl = item as! UILabel
               lbl.attributedText = NSMutableAttributedString(string: annotation.title!!, attributes: strokeTextAttributes)
               break
           }
        }

    }


    annotationLabel.clipsToBounds = true
    annotationLabel.backgroundColor = UIColor.white
    annotationLabel.layer.cornerRadius = 15

    return annotationView
}