我正在使用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
}
因此,您可以看到标签的文本应该更改为标签的标题,因为无论是否已经创建,我都会将文本更改为当前注释。
正如您所见,“Luna Blu”是Tiburon的一家餐厅。在需要更多注释并重复使用注释之后,它说“Luna Blu”位于城市中心。为了表明这实际上是不正确的,当我点击注释时,会出现一个带有真实注释标题的滑出菜单,即“Taylor Street Coffee Shop”。
答案 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
}