微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

UIGestureRecognizer.State在MKMapView上的其他所有单击均“可能”且未“识别”

如何解决UIGestureRecognizer.State在MKMapView上的其他所有单击均“可能”且未“识别”

我正在尝试使用手势识别器来理解可重现的错误。我在MKMapView上有2个识别器,一个UITapGestureRecognizer和一个UILongPressGestureRecogniser。他们两个都第一次按预期方式工作,但是,如果我使用长按(这会在地图上添加注释),则下一个轻击手势将返回“可能”状态,但永远不会达到“已识别”状态。>

▿ Optional<Array<UIGestureRecognizer>>
  ▿ some : 2 elements
    - 0 : <UITapGestureRecognizer: 0x7fda7543ebc0; state = Possible; view = <MKMapView 0x7fda78026e00>>
    - 1 : <UILongPressGestureRecognizer: 0x7fda7543e8c0; state = Possible; view = <MKMapView 0x7fda78026e00>; numberOfTapsrequired = 0; minimumPressDuration = 0.2>

点击一次之后,什么也没有发生,第二次点击将执行相关功能,即使其处于可识别状态。

我正在拦截窗口上的所有点击,每次都肯定会进行点击,但是长按之后的第一次点击似乎从未被接受。我在这里想念什么吗?手势添加如下:

let mapTap = UITapGestureRecognizer(target: self,action: #selector(mapTapped(_:)))
        mapView.addGestureRecognizer(mapTap)

let pressGesture = UILongPressGestureRecognizer(target: self,action: #selector(mapLongPress(_:)))
            pressGesture.minimumPressDuration = 0.2
            pressGesture.numberOftouchesrequired = 1
            mapView.addGestureRecognizer(pressGesture)

这是否与认情况下在MKMapView上添加的其他手势有关?

解决方法

在您的情况下,您希望点击识别器和长按识别器同时运行:点击视图时,两者都应开始识别过程。在长按的最短敲击时间之前结束敲击时,应轻击手势,但在以后再敲击结束时,应长按手势。
但是Apple docs说:

UIKit通常一次只能识别一个手势 一个视图。通常一次只能识别一个手势 首选,因为它可以防止用户输入触发超过 一次执行一项操作。但是,此默认行为可能导致 意外的副作用。例如,在包含两个平移的视图中 和滑动手势识别器,则永远不会识别滑动。因为 平移手势识别器是连续的,它始终可以识别其 滑动手势识别器之前的手势,该手势是离散的。

在您的情况下,长点击手势识别器是连续的,而点击手势识别器是离散的,因此在识别点击时可能会出现问题。

因此,我将尝试明确允许两个识别器同时识别其手势。 here给出了一个示例。
长按识别器启动后,您可以取消敲击识别器的识别操作。
希望这会有所帮助!

,

我尝试使用您的代码并获得了相同的结果。

我用一个棘手的解决方案解决了它。希望对您有帮助

 mapTap = UITapGestureRecognizer(target: self,action: #selector(mapTapped(_:)))
 mapTap.delegate = self
 mapView.addGestureRecognizer(mapTap)
 
 pressGesture = UILongPressGestureRecognizer(target: self,action: 
                    #selector(mapLongPress(_:)))
                    pressGesture.minimumPressDuration = 0.2
                    pressGesture.numberOfTouchesRequired = 1
 mapView.addGestureRecognizer(pressGesture)

 @objc func mapTapped(_ gesture: UITapGestureRecognizer) {
    // your code
 }
 

 @objc func mapLongPress(_ gesture: UILongPressGestureRecognizer) {
    // your code
        
    if gesture.state == .began {
        mapTap.isEnabled = false
    } else if gesture.state == .cancelled || gesture.state == .ended {
        mapTap.isEnabled = true
    }
 }
   
 func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer,shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
    return true
 }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。