swift UILongPressGestureRecognizer在IOS中13秒长按两次MKMapView不工作

tgabmvqs  于 2023-06-21  发布在  Swift
关注(0)|答案(2)|浏览(120)

我已经设置了一个UILongPressGestureRecognizer,在iOS 13之前的版本中工作正常,但在这个版本中要检测第二次长按,我必须按两次。
也就是说:
1º LongPress -> Work Fine显示“长按”
2º LongPress ->不工作
3º LongPress -> Work Fine显示“长按”
4º LongPress ->不工作
...
这是我的代码。

let longTapGesture = UILongPressGestureRecognizer(target: self, action: #selector(longTap))
    longTapGesture.delegate = self
    longTapGesture.numberOfTouchesRequired = 1
    longTapGesture.cancelsTouchesInView = false
    
    mapView.addGestureRecognizer(longTapGesture)

调用的函数为:

@objc func longTap(sender: UIGestureRecognizer){
      print("long tap")
      .....
    }
kgsdhlau

kgsdhlau1#

这个问题的解决方案是允许同时的手势。只需设置长按手势的delegate并实现以下delegate方法:

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
    return true
}

就是这样。Map视图上的长按手势现在每次都有效。
作为演示,创建一个基于Swift和故事板的新iOS项目。将提供的ViewController.swift实现替换为以下内容:

import UIKit
import MapKit

class ViewController: UIViewController {
    let mapView = MKMapView()

    override func viewDidLoad() {
        super.viewDidLoad()

        mapView.translatesAutoresizingMaskIntoConstraints = false
        view.addSubview(mapView)

        NSLayoutConstraint.activate([
            mapView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
            mapView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
            mapView.topAnchor.constraint(equalTo: view.topAnchor),
            mapView.bottomAnchor.constraint(equalTo: view.bottomAnchor),
        ])

        let lp = UILongPressGestureRecognizer(target: self, action: #selector(longPress))
        lp.delegate = self
        view.addGestureRecognizer(lp)
    }

    @objc func longPress(_ gesture: UILongPressGestureRecognizer) {
        switch gesture.state {
            case .began:
                print("began")
            case .ended:
                print("ended")
            case .changed:
                print("changed")
            case .cancelled:
                print("cancelled")
            default:
                print("other")
        }
    }
}

extension ViewController: UIGestureRecognizerDelegate {
    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
        return true
    }
}

请注意,shouldRecognizeSimultaneouslyWith会被调用很多次。似乎至少有3个其他手势,包括另一个长按手势,预计两次触摸。因此,最好不要设置自己的长按手势需要两次触摸。

x3naxklr

x3naxklr2#

在iOS 13中,UILongPressGestureRecognizer仅识别每次触摸的单次长按。您可以尝试将“delaysTouchesBegan”设置为false。
例如:

let longTapGesture = UILongPressGestureRecognizer(target: self, action: #selector(longTap))
longTapGesture.delegate = self
longTapGesture.numberOfTouchesRequired = 1
longTapGesture.cancelsTouchesInView = false
longTapGesture.delaysTouchesBegan = false

mapView.addGestureRecognizer(longTapGesture)

以下是我找到的资源:delaysTouchesBegan Doc

相关问题