Обнаружение на calloutAccessoryControlTapped только крана на rightCalloutAccessoryView
Мой calloutAccessoryControlTapped
также вызывается, когда я просто нажимаю на аннотацию и это поведение правильно. Но как я могу определить, если пользователь нажал на правый вид аксессуаров (в моем случае кнопка раскрытия подробностей) , а не только в представлении?
Я добавил простую проверку, но она не работает.
import UIKit
import MapKit
extension MapVC: MKMapViewDelegate, CLLocationManagerDelegate
{
func mapView(mapView: MKMapView, annotationView view: MKAnnotationView, calloutAccessoryControlTapped control: UIControl)
{
if control == view.rightCalloutAccessoryView
{
... // enter here even if I tapped on the view annotation and not on button
}
}
}
Ответы
Ответ 1
Чтобы достичь этого, вам нужно добавить цель для правильного вида аксессуаров. Вы можете достичь этого, установив кнопку rightCalloutAccessoryView, как показано в фрагменте кода.
class MapViewController: UIViewController, MKMapViewDelegate {
func mapView(mapView: MKMapView, viewForAnnotation annotation: MKAnnotation) -> MKAnnotationView? {
if annotation is Annotation {
let annotationView = AnnotationView(annotation: annotation, reuseIdentifier: "reuseIdentifier")
let rightButton = UIButton(type: .DetailDisclosure)
rightButton.addTarget(self, action: #selector(didClickDetailDisclosure(_:)), forControlEvents: .TouchUpInside)
annotationView.rightCalloutAccessoryView = rightButton
}
return nil
}
func didClickDetailDisclosure(button: UIButton) {
// TODO: Perform action when was clicked on right callout accessory view.
}
}
// Helper classes.
class Annotation: NSObject, MKAnnotation {
var coordinate: CLLocationCoordinate2D
var title: String?
var subtitle: String?
init(coordinate: CLLocationCoordinate2D, title: String, subtitle: String) {
self.coordinate = coordinate
self.title = title
self.subtitle = subtitle
}
}
class AnnotationView: MKAnnotationView {
}
Ответ 2
-
Использование UIView и UITapGestureRecognizer вместо UIControl
func mapView(mapView: MKMapView, viewForAnnotation annotation: MKAnnotation) -> MKAnnotationView? {
let annotationView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: "reuseIdentifier")
let gestureView = UIView(frame:CGRect(x: 0,y: 0,width: 20,height: 20))
let gestureRecognizer = UITapGestureRecognizer()
gestureRecognizer.addTarget(self, action: #selector(MapViewController.didClickGestureRecognizer(_:)))
gestureView.addGestureRecognizer(gestureRecognizer)
gestureView.backgroundColor = UIColor.redColor()
annotationView.rightCalloutAccessoryView = gestureView
return annotationView
}
func didClickGestureRecognizer(sender:UITapGestureRecognizer) -> Void {
print("didClickGestureRecognizer")
}
Когда вы нажимаете rightCalloutAccessoryView
, вызывается только didClickGestureRecognizer
, но ваш calloutAccessoryControlTapped
не может быть вызван никому.
2.Если у вас UIControl как rightCalloutAccessoryView
, вы можете напрямую нажать MKAnnotationView. В противном случае MKAnnotationView не может быть использован.
Как ваш селектор, так и calloutAccessoryControlTapped
будут вызваны при нажатии rightCalloutAccessoryView
или нажмите прямо на MKAnnotationView
3.Если у вас UIControl как leftCalloutAccessoryView
, вы будете вызывать ваш селектор и calloutAccessoryControlTapped
, когда вы нажмете на него.
4.Since iOS 9, вы можете иметь detailCalloutAccessoryView
в своем MKAnnotationView. Только ваш селектор вызывается, когда вы на него нажимаете.
5. Также вы можете создать свой собственный MKAnnotationView и изменить его поведение.