iOS swift: MKPointAnnotation не всегда показывает заголовок

Я ломаю голову над странным поведением, которое я замечаю, когда пытаюсь отобразить MKPointAnnotation на MKMapView в iOS 10. Я нашел 2 связанных поста в Stackru, но ни один из них фактически не отвечает на проблему, с которой я сталкиваюсь. Они есть:

  1. /questions/22465402/mkmapview-zagolovok-annotatsii-ne-otobrazhaetsya но это не имеет никакого ответа, и проблема кажется немного другой, поскольку здесь название НИКОГДА не показывает, в то время как в моем случае это действительно показывает но со странным обходным путем.
  2. /questions/37882131/ios-annotatsii-mapview-dlya-vyivodov-ne-otobrazhayutsya но пользователь просто забыл установить заголовок. В конце есть интересный комментарий от @rockhammer, который в некоторой степени связан, но не совсем: "Кажется, что в то время, когда на карту добавляется аннотация, заголовок.title должен содержать хотя бы один символ, даже если это " " В противном случае, даже если.title впоследствии будет изменен, чтобы отличаться от "", метка не будет отображаться. '

Моя ситуация: у меня есть функция, где, когда пользователь нажимает на карту, будет добавлена ​​аннотация. Заголовок, по сути, является первой доступной строкой адреса, найденной с помощью поиска 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)
    }
}

Если кто-то может показать мне логику и как / почему это происходит, это было бы замечательно.

1 ответ

Вам нужно изменить 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)
    }
}
Другие вопросы по тегам