Определить при вызове AccessoryControlTapped только нажатие на право CalloutAccessoryView
Мой 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
}
}
}
2 ответа
Для этого вам нужно добавить цель для правильного вида аксессуара. Вы можете добиться этого, установив кнопку в 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 {
}
Использование 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. С iOS 9 вы можете detailCalloutAccessoryView
в вашем MKAnnotationView. Только ваш селектор будет вызван, когда вы нажмете на него.
5.Также вы можете создать свой собственный MKAnnotationView и изменить его поведение.