Ich habe einige Erfahrung mit MKMapView
und MKPointAnnotation
, die ich verwendet habe, um einige Pin auf einer Karte zu setzen. Dieses Mal versuche ich, einen Schritt weiter zu gehen und MKPinAnnotationView
zu verwenden, um ein Etikett zusammen mit einigen der Pins zu schreiben.MKPinAnnotationView zeigt keinen Titel an
Leider funktioniert es nicht so, wie ich es erwarte.
Hier ist, was ich tun möchte:
Ich habe eine Karte (ein MKMapView Objekt) und wenn ich es berühren, habe ich am Berührungspunkt einen Stift, dann einige Berechnung durchgeführt wird, und das gibt mir ein zweiter Punkt auf der Karte. Ich lege einen zweiten Pin (am zweiten Punkt), auf diesen letzten Pin möchte ich ein Label setzen, sagen "Hallo Second!". Hier
ist der entsprechende Code:
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
}
}
Hier ist, was passiert, sind die Stifte wie erwartet platziert, aber ich habe keine Aufkleber auf dem zweiten sehen. Ich habe auch bemerkt, dass, wenn ich klopfe, wo der zweite Pin zufällig ist (in diesem Fall wird der 2. Pin am selben Ort bleiben), dann erscheint das Etikett (wie es immer tun sollte). Wenn ich erneut tippe (nicht so nah), verschwindet das Etikett wieder (obwohl es nicht sollte).
Gibt es etwas in meinem Code (oben), das ist nicht richtig? Jeder relevante Tipp wird geschätzt.
Nun, ich sollte nicht ein anderes SDK (Google Maps API) verwenden müssen, um dies zu tun. Ich nehme an, wenn ich die Dinge richtig mache, sollte es funktionieren wie ich will. – Michel
Ich gebe Ihnen nur die grobe Idee Ich bin nicht gefragt, Google Map zu verwenden. – hussain