如何以编程方式 select Mapkit 中的特定注释 - Swift
How programmatically select a specific annotation in Mapkit - Swift
我正在 MapKit/Swift 4 中开发一张地图,其中有很多注释。
用户可以 select 使用选择器查看他想要的注释(仅 1 个),然后将调用该注释(就好像他已按下它一样)。
如果方便的话,我们可以考虑改变这个标注点的颜色。
关键是要在众多注解中突出这个特别的注解。
经过一番搜索,我找到了这个函数
func selectAnnotation(_ annotation: MKAnnotation, animated: Bool)
我实现了以下功能:
func selectPoints() {
print("selectPoints called")
let annotation1 = MKPointAnnotation()
annotation1.coordinate = CLLocationCoordinate2D(latitude: 48.8596833, longitude: 2.3988939)
annotation1.title = "Temple"
annotation1.subtitle = "\(annotation1.coordinate.latitude), \(annotation1.coordinate.longitude)"
mapView.addAnnotation(annotation1)
mapView.selectAnnotation(annotation1, animated: true)
}
所以如果我创建一个新的注释它就可以工作,但是我怎么能 select 以前的注释点呢?
但是我没有任何想法或提示可以继续。
谢谢你的帮助。
编辑:输入注释的部分代码。
func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
if let annotation = annotation as? Artwork {
let reuseId = "pin"
var pinView = mapView.dequeueReusableAnnotationView(withIdentifier: reuseId)
if pinView == nil {
pinView = MKAnnotationView(annotation: annotation, reuseIdentifier: reuseId)
pinView!.canShowCallout = true
pinView!.isDraggable = false
pinView!.calloutOffset = CGPoint(x: 0, y: 0)
pinView!.rightCalloutAccessoryView = UIButton(type: .detailDisclosure) as UIView
}
else {
pinView!.annotation = annotation
}
}
return nil
}
您可以使用 mapView
的 annotations
属性 执行此操作。作为一个粗略的轮廓,在你的视图控制器中你会有这样的代码:
func beginAnnotationSelection() {
self.view.addSubview(self.pickerView)
}
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 1
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
return self.mapView.annotations.count
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
return self.mapView.annotations[row].title ?? "No title"
}
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
self.mapView.selectAnnotation(self.mapView.annotations[row], animated: true)
}
请注意,这假定 mapView
和 pickerView
是您的视图控制器的实例变量,并且选择器视图的数据源和委托设置为您的视图控制器。我没有为选择器视图或任何东西做任何框架设置,所以你必须自己实现所有这些。
我正在 MapKit/Swift 4 中开发一张地图,其中有很多注释。 用户可以 select 使用选择器查看他想要的注释(仅 1 个),然后将调用该注释(就好像他已按下它一样)。 如果方便的话,我们可以考虑改变这个标注点的颜色。 关键是要在众多注解中突出这个特别的注解。
经过一番搜索,我找到了这个函数
func selectAnnotation(_ annotation: MKAnnotation, animated: Bool)
我实现了以下功能:
func selectPoints() {
print("selectPoints called")
let annotation1 = MKPointAnnotation()
annotation1.coordinate = CLLocationCoordinate2D(latitude: 48.8596833, longitude: 2.3988939)
annotation1.title = "Temple"
annotation1.subtitle = "\(annotation1.coordinate.latitude), \(annotation1.coordinate.longitude)"
mapView.addAnnotation(annotation1)
mapView.selectAnnotation(annotation1, animated: true)
}
所以如果我创建一个新的注释它就可以工作,但是我怎么能 select 以前的注释点呢? 但是我没有任何想法或提示可以继续。
谢谢你的帮助。
编辑:输入注释的部分代码。
func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
if let annotation = annotation as? Artwork {
let reuseId = "pin"
var pinView = mapView.dequeueReusableAnnotationView(withIdentifier: reuseId)
if pinView == nil {
pinView = MKAnnotationView(annotation: annotation, reuseIdentifier: reuseId)
pinView!.canShowCallout = true
pinView!.isDraggable = false
pinView!.calloutOffset = CGPoint(x: 0, y: 0)
pinView!.rightCalloutAccessoryView = UIButton(type: .detailDisclosure) as UIView
}
else {
pinView!.annotation = annotation
}
}
return nil
}
您可以使用 mapView
的 annotations
属性 执行此操作。作为一个粗略的轮廓,在你的视图控制器中你会有这样的代码:
func beginAnnotationSelection() {
self.view.addSubview(self.pickerView)
}
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 1
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
return self.mapView.annotations.count
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
return self.mapView.annotations[row].title ?? "No title"
}
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
self.mapView.selectAnnotation(self.mapView.annotations[row], animated: true)
}
请注意,这假定 mapView
和 pickerView
是您的视图控制器的实例变量,并且选择器视图的数据源和委托设置为您的视图控制器。我没有为选择器视图或任何东西做任何框架设置,所以你必须自己实现所有这些。