2017-01-14 9 views
1

이상한 행동을 통해 머리를 부러 뜨 렸습니다. IOS 10의 MKMapView에 MKPointAnnotation을 표시하려고 할 때주의를 기울이고 있습니다. StackOverflow에서 2 개의 관련 게시물을 발견했지만 실제로는 그렇지 않습니다. 내가 직면하고있는 문제에 대한 해답.iOS swift : MKPointAnnotation이 항상 제목을 표시하지 않음

  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는 흥미롭지 만, 관련이 있지만 정확히는 그렇지 않습니다. '주석이 맵에 추가 될 때 .title은 문자가 하나라도 있어야합니다. "". 그렇지 않으면 .title이 ""이외의 것으로 수정 된 경우에도 레이블이 표시되지 않습니다. '

내 상황 : 사용자가지도에서 길게 누르면 어노테이션이 추가되는 기능이 있습니다. 제목은 기본적으로 CLGeocoder(). reverseGeocodeLocation (...) 조회를 사용하여 찾은 주소의 첫 번째 사용 가능한 행입니다. 모두 실패하면 단순히 날짜 만 사용하게됩니다. 제목에 텍스트가 있다는 것을 확신 할 때 주석이 끝까지 추가되는 것을 볼 수 있습니다. 이것은 위에서 언급 한 두 번째 게시물의 주석이이 상황에 맞지 않게합니다.

내 문제 : 상단 부근에 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) 
    } 
} 

누구나 내게 논리를 표시하고 어떻게/왜 이런 일이 일어나고 있는지, 훌륭 할 것입니다.

답변

0

잘못된 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) 
    } 
}