在以下方法中MKMapViewDelegate:
func mapView(mapView: MKMapView, viewForAnnotation annotation: MKAnnotation) -> MKAnnotationView? {
let pinAnnotationView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: "")
pinAnnotationView.rightCalloutAccessoryView = UIButton(type: .DetailDisclosure)
pinAnnotationView.canShowCallout = true
return pinAnnotationView
}
Run Code Online (Sandbox Code Playgroud)
如果我像上面那样做,那么整个视图都是可点击的:
除此以外:
func mapView(mapView: MKMapView, viewForAnnotation annotation: MKAnnotation) -> MKAnnotationView? {
let pinAnnotationView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: "")
let accessoryView = UIButton(frame: CGRectMake(0, 0, 25, 25))
accessoryView.setImage(UIImage(named: "icon-menu"), forState: .Normal)
pinAnnotationView.rightCalloutAccessoryView = accessoryView
pinAnnotationView.canShowCallout = false
return pinAnnotationView
}
Run Code Online (Sandbox Code Playgroud)
只有右附件视图被点击,为什么?
问题是。怎么做才能使整体可点击
MKPinAnnotationView而不仅仅是正确的披露?
我仍在寻找为什么这适用于第一个代码块中的完整标注视图,但不适用于第二个代码块。
我找到了如何使整个 MKPinAnnotationView 标注视图可点击的答案。
基本上我们可以通过两种方法实现这一点。
1.使用正常方法。
在这里,我为rightCalloutAccessoryView使用了一个图像,但是在声明如下按钮时有一些小的变化。
func mapView(mapView: MKMapView, viewForAnnotation annotation: MKAnnotation) -> MKAnnotationView? {
let reuseIdentifier = "pin"
var pin = mapView.dequeueReusableAnnotationViewWithIdentifier(reuseIdentifier) as? MKPinAnnotationView
if pin == nil {
pin = MKPinAnnotationView(annotation: annotation, reuseIdentifier: reuseIdentifier)
pin!.pinTintColor = UIColor.redColor()
pin!.canShowCallout = true
let button = UIButton(type: .DetailDisclosure)
button.frame = CGRect(x: 0, y: 0, width: 30, height: 30)
button.setBackgroundImage(UIImage(named: "img.png"), forState: .Normal)
pin!.rightCalloutAccessoryView = button
} else {
pin!.annotation = annotation
}
return pin
}
Run Code Online (Sandbox Code Playgroud)
在此处声明 Button 时,我将其指定为DetailDisclosure类型。
2. 第二种方法是使用 UITapGestureRecognizer
在这里,我实现了两个标注委托方法,如下所示。
//called when select an annotation
func mapView(mapView: MKMapView, didSelectAnnotationView view: MKAnnotationView) {
let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(tapped))
view.addGestureRecognizer(tapGestureRecognizer)
}
//Called when deselects the annotation
func mapView(mapView: MKMapView, didDeselectAnnotationView view: MKAnnotationView) {
view.removeGestureRecognizer(view.gestureRecognizers!.first!)
}
func tapped(sender: UITapGestureRecognizer) {
if let view = sender.view as? MKAnnotationView {
performSegueWithIdentifier("info", sender: view)
//do yours
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
462 次 |
| 最近记录: |