背景 - 我有一个带标注的地图(MapKit)(自定义视图添加到注释视图) - 我已经设法确保"长按"在标注视图上进行的手势不会被拾取(参见下文,使用" shouldReceiveTouch")
问题 我不能做的是做同样的事情(即忽略)在标注视图上双击,因为MapKit地图仍然以某种方式拾取并放大。我已经尝试过放置双击然后手势陷入困境,但它似乎并没有起作用。
Mapkit查看代理代码
手势识别器的设置
// Gesture Recogniser (Long Press)
let longPressGR = UILongPressGestureRecognizer(target: self, action: "longPressAction:")
longPressGR.minimumPressDuration = 1
longPressGR.delegate = self
self.mapView.addGestureRecognizer(longPressGR)
// Gesture Recogniser (Double Tap)
let doubleTapGR = UITapGestureRecognizer(target: self, action: "doubleTapAction:")
doubleTapGR.numberOfTapsRequired = 2
doubleTapGR.delegate = self
self.mapView.addGestureRecognizer(doubleTapGR)
实施" shouldReceiveTouch" for UIGestureRecognizerDelegate
extension GCMapViewHelper : UIGestureRecognizerDelegate {
func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldReceiveTouch touch: UITouch) -> Bool {
guard let touchesView = touch.view else { fatalError("ERROR: Touch event received was nil") }
for annotation in self.mapView.selectedAnnotations {
if annotation is GCAnnotation {
let annotationView = self.mapView.viewForAnnotation(annotation)
if let annotationView = annotationView {
if (touchesView.isDescendantOfView(annotationView)) {
return false
}
}
}
}
return true
}
}
编辑:似乎问题是双击手势识别器没有拿起双击......任何想法?即这不起作用..
doubleTapGR.numberOfTapsRequired = 2
编辑2 以下是问题重新编码示例的简化视图:
根据我在print语句的控制台输出中看到的代码,使用下面的代码: *" longPressAction" - 这似乎/有效 *" tapAction" - 即使我双击MKMapView,也不会出现这种情况。所以这是我的问题。
import UIKit
import MapKit
class ViewController: UIViewController {
@IBOutlet weak var mapview: MKMapView!
func longPressAction() {
print("longPressAction")
}
func tapAction() {
print("tapAction") // ** Not appearing in console **
}
override func viewDidLoad() {
super.viewDidLoad()
// Gesture Recogniser (Long Press)
let longPressGR = UILongPressGestureRecognizer(target: self, action: "longPressAction")
longPressGR.minimumPressDuration = 1
self.mapview.addGestureRecognizer(longPressGR)
let tapGR = UITapGestureRecognizer(target: self, action: "tapAction")
tapGR.numberOfTapsRequired = 2
self.mapview.addGestureRecognizer(tapGR)
//tapGR.requireGestureRecognizerToFail(longPressGR)
}
}
答案 0 :(得分:1)
虽然它不是您问题的直接答案 - 但我有一个解决方法。
如果您将手势识别器添加到自定义注释视图中,则可以捕获长按和双击注释视图以及任何关联的标注。
我写的一些示例代码尝试这个:
import UIKit
import MapKit
class StarAnnotation : NSObject, MKAnnotation {
let title: String?
let coordinate: CLLocationCoordinate2D
init(title: String, coordinate: CLLocationCoordinate2D) {
self.title = title
self.coordinate = coordinate
super.init()
}
}
class StarAnnotationView : MKAnnotationView, UIGestureRecognizerDelegate {
override init(annotation: MKAnnotation?, reuseIdentifier: String?) {
super.init(annotation: annotation, reuseIdentifier: reuseIdentifier)
self.image = UIImage(named: "star")
// Gesture Recogniser (Long Press)
let longPressGR = UILongPressGestureRecognizer(target: self, action: "longPressAction:")
longPressGR.minimumPressDuration = 1
longPressGR.delegate = self
self.addGestureRecognizer(longPressGR)
// Gesture Recogniser (Double Tap)
let doubleTapGR = UITapGestureRecognizer(target: self, action: "doubleTapAction:")
doubleTapGR.numberOfTapsRequired = 2
doubleTapGR.delegate = self
self.addGestureRecognizer(doubleTapGR)
}
override init(frame: CGRect) {
super.init(frame: frame)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func doubleTapAction(recognizer: UITapGestureRecognizer) {
if recognizer.numberOfTapsRequired == 2 {
print("double tapped")
}
}
func longPressAction(recognizer: UILongPressGestureRecognizer) {
print("long pressed")
}
}
class ViewController: UIViewController, MKMapViewDelegate {
@IBOutlet weak var mapView: MKMapView!
override func viewDidLoad() {
super.viewDidLoad()
// set up map view and sample annotation
let operaHouseCoord = CLLocationCoordinate2D(latitude: -33.8587, longitude: 151.2148)
let span = MKCoordinateSpan(latitudeDelta: 0.01, longitudeDelta: 0.01)
let operaHouseAnnotation = StarAnnotation(title: "Opera House", coordinate: operaHouseCoord)
mapView.region = MKCoordinateRegion(center: operaHouseCoord, span: span)
mapView.delegate = self
mapView.addAnnotation(operaHouseAnnotation)
}
func mapView(mapView: MKMapView, viewForAnnotation annotation: MKAnnotation) -> MKAnnotationView? {
if let annotation = annotation as? StarAnnotation {
let identifier = "star"
if let dequeuedView = mapView.dequeueReusableAnnotationViewWithIdentifier(identifier) as? StarAnnotationView {
dequeuedView.annotation = annotation
return dequeuedView
} else {
let view = StarAnnotationView(annotation: annotation, reuseIdentifier: identifier)
view.canShowCallout = true
return view
}
}
return nil
}
}