iOS swift : MKPointAnnotation not always showing title

标签 ios swift mkmapview mkpointannotation

当我尝试在 iOS 10 中的 MKMapView 上显示 MKPointAnnotation 时,我注意到了一个奇怪的行为,这让我大吃一惊。我在 StackOverflow 上找到了 2 个相关帖子,但都没有真正回答我面临的问题。它们是:

  1. https://stackoverflow.com/questions/36760810/mkmapview-annotation-title-is-not-showing但这没有任何答案,而且问题似乎略有不同,因为这里的标题从不显示,而在我的情况下它确实显示但有一个奇怪的解决方法。
  2. https://stackoverflow.com/questions/33818285/ios-mapview-annotations-not-showing-for-pins但是用户只是忘记了实际设置标题。 @rockhammer 最后有一个有趣的评论,虽然有点相关但不完全是:'看起来在将注释添加到 map 时,.title 必须至少有一个字符,即使它是一个” “。否则,即使 .title 随后被修改为“”以外的其他名称,标签也不会显示。'

我的情况:我有一个功能,当用户在 map 上长按时,将添加注释。标题基本上是使用 CLGeocoder().reverseGeocodeLocation(...) 查找找到的地址的第一行。如果全部失败,它将简单地使用日期。您会注意到,只有在绝对确定标题中有文本时,注释才会一直添加到最后。这使得上述第 2 个帖子的评论不适合这种情况。

我的问题:您会注意到靠近顶部的行 annotation.title = "BLAH"。如果没有这一行,注释标题将不会显示在 MKMapView 中,而只会显示图钉!

@IBOutlet weak var map: MKMapView!

func longPress(gestureRecognizer: UIGestureRecognizer) {
    if gestureRecognizer.state == UIGestureRecognizerState.began {
        let touchPoint = gestureRecognizer.location(in: self.map)
        let coordinate = map.convert(touchPoint, toCoordinateFrom: self.map)
        let annotation = MKPointAnnotation()
        annotation.coordinate = coordinate
        annotation.title = "BLAH" //WITHOUT THIS THE TITLE NEVER SHOWS

        CLGeocoder().reverseGeocodeLocation(CLLocation(latitude: coordinate.latitude, longitude: coordinate.longitude)) { (placemarks, error) in
            if error != nil {
                print(error!)
            } else {
                if let placemark = placemarks?[0] {
                    annotation.title = placemark.subThoroughfare != nil ? placemark.subThoroughfare! : ""
                    annotation.title = annotation.title! + (annotation.title! == "" ? "" : " ") + (placemark.thoroughfare != nil ? placemark.thoroughfare! : "")
                    if annotation.title == "" {
                        annotation.title = placemark.subLocality != nil ? placemark.subLocality! : ""
                        if annotation.title == "" {
                            annotation.title = placemark.subAdministrativeArea != nil ? placemark.subAdministrativeArea! : ""
                            if annotation.title == "" {
                                annotation.title = placemark.postalCode != nil ? placemark.postalCode! : ""
                                if annotation.title == "" {
                                    annotation.title = placemark.country != nil ? placemark.country! : ""
                                }
                            }
                        }
                    }
                }
            }
            if annotation.title == "" {
                annotation.title = "Added \(NSDate())"
            } //At this point a title is guaranteed to be set. Still, it never shows unless it is first 'initialised' with 'BLAH' or something at the beginning.
        }

        self.map.addAnnotation(annotation)
    }
}

如果有人能告诉我逻辑以及这是如何/为什么发生的,那就太好了。

最佳答案

您需要更改3个不正确的方法; 我不知道为什么这种方法不起作用。

我向您推荐一些其他的方法,这些方法可以正常编译并正常工作。你需要:

  • UIGestureRecognizerState.began更改为UIGestureRecognizerState.Began

  • touchPoint = gestureRecognizer.location(in: self.map)更改为touchPoint = gestureRecognizer.locationInView(self.mapView)

  • 最后,将 coordinate = mapView.convert(teste, toCoordinateFrom: self.mapView) 更改为 coordinate = mapView.convertPoint(touchPoint, toCoordinateFromView: self.mapView).

最后你的代码应该是这样的:

@IBOutlet weak var map: MKMapView!


func longPress(gestureRecognizer: UIGestureRecognizer) {
    if gestureRecognizer.state == UIGestureRecognizerState.Began {     // And not .began
        let touchPoint: CGPoint = gestureRecognizer.locationInView(self.map)   //And not location(in: self.map)
    //let coordinate = mapView.convert(teste, toCoordinateFrom: self.map)
    let coordinate = map.convertPoint(touchPoint, toCoordinateFromView: self.map)
        let annotation = MKPointAnnotation()
        annotation.coordinate = coordinate
        //annotation.title = "BLAH" //WITHOUT THIS THE TITLE NEVER SHOWS

        CLGeocoder().reverseGeocodeLocation(CLLocation(latitude: coordinate.latitude, longitude: coordinate.longitude)) { (placemarks, error) in
            if error != nil {
                print(error!)
            } else {
                if let placemark = placemarks?[0] {
                    annotation.title = placemark.subThoroughfare != nil ? placemark.subThoroughfare! : ""
                    annotation.title = annotation.title! + (annotation.title! == "" ? "" : " ") + (placemark.thoroughfare != nil ? placemark.thoroughfare! : "")
                    if annotation.title == "" {
                        annotation.title = placemark.subLocality != nil ? placemark.subLocality! : ""
                        if annotation.title == "" {
                            annotation.title = placemark.subAdministrativeArea != nil ? placemark.subAdministrativeArea! : ""
                            if annotation.title == "" {
                                annotation.title = placemark.postalCode != nil ? placemark.postalCode! : ""
                                if annotation.title == "" {
                                    annotation.title = placemark.country != nil ? placemark.country! : ""
                                }
                            }
                        }
                    }
                }
            }

            if annotation.title == "" {
                annotation.title = "Added \(NSDate())"
            } //At this point a title is guaranteed to be set. Still, it never shows unless it is first 'initialised' with 'BLAH' or something at the beginning.
        }

        self.map.addAnnotation(annotation)
    }
}

关于iOS swift : MKPointAnnotation not always showing title,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41654036/

相关文章:

iphone - 发送到实例的无法识别的选择器

ios - 如何仅为 UIImage 的非白色部分设置色调颜色?

objective-c - 使用 CGRectZero 初始化 UIView 的框架

Swift 枚举超出范围

swift - 获取选定区域的坐标

ios - 我如何用字典支持一堆类属性?

ios - 如何在 Xcode 中遍历 self.superview?

快速过滤功能

swift - 如何检查注释是否聚集(MKMarkerAnnotationView 和 Cluster)

ios - MKMapView 中用户位置标注的跟踪选择