Как программно выбрать конкретную аннотацию в Mapkit - Swift
Я разрабатываю карту в MapKit/Swift 4, где у меня много аннотаций. Пользователь может выбрать с помощью Picker View, какую аннотацию (только 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)
}
Так что это работает, если я создаю новую аннотацию, но как я могу выбрать предыдущие точки аннотации? Но я не имею ни малейшего представления или намека на то, чтобы идти вперед.
Спасибо за помощь.
РЕДАКТИРОВАТЬ: часть кода для ввода аннотаций.
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
}
1 ответ
Вы можете сделать это с annotations
собственность вашего mapView
, В общих чертах, в вашем контроллере вида у вас будет такой код:
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
являются переменными экземпляра вашего контроллера представления, и что источник данных и делегат представления выбора установлены на ваш контроллер представления. Я не делаю никакой настройки фрейма для представления выбора или чего-либо еще, поэтому вам придется реализовать все это самостоятельно.