我已經有一些過去使用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 -TITLE!"
//* I want to update the label for this pin (attached to the secondPoint) too.
}
} 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: MyPinAnnotationView
if let dequeuedView = mapView.dequeueReusableAnnotationView(withIdentifier: identifier)
as? MyPinAnnotationView {
dequeuedView.annotation = annotation
view = dequeuedView
} else {
view = MyPinAnnotationView(annotation: annotation, reuseIdentifier: identifier)
if ((annotation.coordinate.latitude != touchPoint.coordinate.latitude) ||
(annotation.coordinate.longitude != touchPoint.coordinate.longitude)) {//* I need a better test to check that this not touchPoint!
view.pinTintColor = UIColor.blue
view.canShowCallout = true
view.calloutOffset = CGPoint(x: -7, y: 0)
view.setInfo(title: "Hi Start Label!")
} else {
view.pinTintColor = UIColor.red
view.canShowCallout = false
}
}
return view
}
}
這裏是類MyPinAnnotationView:
import UIKit
import MapKit
class MyPinAnnotationView: MKPinAnnotationView {
let information:UILabel = UILabel(frame: CGRect(origin: CGPoint.zero, size: CGSize(width: 70.0, height: 30.0)))
func setInfo(title : String)
{
information.text = title
information.textAlignment = .center
self.addSubview(information)
}
func hideInfo() {
information.removeFromSuperview()
}
}
帶有註釋的行標// *,顯示我需要一些幫助。
第一個問題,我想更新secondPoint上的標籤,但我不知道要使用什麼代碼。行:
// *我想要更新此引腳(附加到secondPoint)的標籤。
現在標籤顯示爲第一組,但我不知道如何更新它。
第二個問題,必須有一個更好的方法來測試我正在處理的針腳。行:
// *我需要一個更好的測試來檢查這個不是touchPoint!
如果你不介意,你會分享你的演示嗎?我可以理解你的問題,併發布它的答案 –
好,但讓我知道你需要知道,這是不是在我的文章。我已經在這篇文章中分享了所有我能想到的主題。 – Michel
檢查此答案我認爲這將幫助你http://stackoverflow.com/questions/24467408/swift-add-mkannotationview-to-mkmapview –