gpt4 book ai didi

ios - 为什么在此 IOS 代码中仍会拾取双击?

转载 作者:行者123 更新时间:2023-11-28 06:48:12 25 4
gpt4 key购买 nike

背景- 我有一张带有标注的 map (MapKit)(自定义 View 添加到注释 View )- 我已经设法确保在标注 View 上做出的“长按”手势不会被拾取(见下文,使用“shouldReceiveTouch”)

问题我不能做的是做同样的事情(即忽略)双击标注 View ,因为 MapKit map 仍然以某种方式拾取它并放大。我试过将双击手势放入陷阱但是它似乎不起作用。

Mapkit 查看委托(delegate)代码

手势识别器的设置

// 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)

为 UIGestureRecognizerDelegate 实现“shouldReceiveTouch”

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

EDIT 2 这是问题重新代码示例的简化 View :

根据我在打印语句的控制台输出中看到的内容,使用以下代码:* "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)

}

}

最佳答案

虽然这不是您问题的直接答案 - 我为您准备了一个解决方法。

如果您将手势识别器添加到您的自定义注释 View ,那么您可以在注释 View 和任何关联的标注上捕获长按和双击。

我写的一些示例代码来尝试这个:

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
}
}

关于ios - 为什么在此 IOS 代码中仍会拾取双击?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35697397/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com