У меня был прошлый опыт, используя MKMapView
и MKPointAnnotation
, который я использовал, чтобы поместить некоторый вывод на карту. На этот раз я пытаюсь сделать еще один шаг и использовать MKPinAnnotationView
, чтобы написать ярлык вместе с некоторыми выводами.MKPinAnnotationView, не отображающий заголовок
К сожалению, это не все работает так, как я ожидаю.
Вот что я хочу сделать:
У меня есть карта (объект MKMapView), и когда я касаюсь его, я положил палец на точках касания, то некоторые вычисления производятся, и это дает мне вторая точка на карте. Я положил второй вывод (расположенный во второй точке), на этом последнем булавке я хочу поставить ярлык, скажем «Hello Second!».
Вот соответствующий код:
class ViewController: UIViewController, MKMapViewDelegate {
var mapView:MKMapView!, touchPoint,secondPoint:MKPointAnnotation!
override func viewDidLoad() {
super.viewDidLoad()
mapView = MKMapView()
...........
let mapTap = UITapGestureRecognizer(target: self,
action: #selector(ViewController.mapTouchHandler))
mapView.addGestureRecognizer(mapTap)
}
func mapTouchHandler(gesture:UITapGestureRecognizer) {
...........
// Compute map coordinates for the touch point (tapGeoPoint).
if touchPoint == nil {
touchPoint = MKPointAnnotation()
mapView.addAnnotation(touchPoint);
}
touchPoint.coordinate = CLLocationCoordinate2D(latitude: tapGeoPoint.latitude,
longitude: tapGeoPoint.longitude)
...........
computeSecondPoint(url: someComputedURL)
}
func computeSecondPoint(url searchURL:String) {
let reqURL = NSURL(string: searchURL)!, session = URLSession.shared,
task = session.dataTask(with: reqURL as URL) {
(data: Data?, response: URLResponse?, error: Error?) in
if error == nil {
do {let allData = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? NSArray
.................
// Compute map coordinates for the second point (secondPointCoord).
if self.secondPoint == nil {
self.secondPoint = MKPointAnnotation()
self.mapView.addAnnotation(self.secondPoint)
}
DispatchQueue.main.async {
() -> Void in
self.secondPoint.coordinate = CLLocationCoordinate2D(latitude: secondPointCoord.latitude,
longitude: secondPointCoord.longitude)
self.secondPoint.title = "Hello Second!"
}
} catch let error as NSError {print(error.localizedDescription)}
} else {
print("Error inside \(#function):\n\(error)")
}
}
task.resume()
}
func mapView(_ mapView: MKMapView,
viewFor annotation: MKAnnotation) -> MKAnnotationView? {
let identifier = "pin"
var view: MKPinAnnotationView
if let dequeuedView = mapView.dequeueReusableAnnotationView(withIdentifier: identifier)
as? MKPinAnnotationView {
dequeuedView.annotation = annotation
view = dequeuedView
} else {
view = MKPinAnnotationView(annotation: annotation, reuseIdentifier: identifier)
view.canShowCallout = true
view.calloutOffset = CGPoint(x: -5, y: 0)
}
return view
}
}
Теперь вот что происходит, контакты расположены, как и ожидалось, но я не вижу этикетку на второй. Я также заметил, что если я нахожусь там, где находится второй контакт (в этом случае второй вывод останется в одном месте), тогда появляется метка (как и всегда). Если я снова коснусь (не так близко), метка снова исчезнет (хотя это не должно).
Есть что-то в моем коде (выше), что не так? Любой соответствующий совет будет оценен по достоинству.
Ну, я не должен использовать другой SDK (API Карт Google), чтобы иметь возможность сделать это. Я полагаю, что если я сделаю все правильно, это должно работать так, как я хочу. – Michel
Я просто даю вам приблизительную идею Я не прошу использовать карту google. – hussain