Ios 使用长按手势向UICollectionView添加菜单覆盖

Ios 使用长按手势向UICollectionView添加菜单覆盖,ios,iphone,swift,Ios,Iphone,Swift,我有一个UICollectionView,通常包含100-200个单元格,可以水平和垂直滚动。我试图在用户执行长按手势时提供一个简单的UIView弹出窗口,其中包含3个图标,以便用户轻松导航到UICollectionView中的两个特定单元格 我想在长按开始时弹出弹出窗口,然后用户将手指拖动到三个图标中的一个,然后释放以选择该图标 我遇到的问题是,我不知道如何让包含3个图标的视图或图标本身响应长按手势的结束 以下是UIViewController的简化: class MyViewControll

我有一个UICollectionView,通常包含100-200个单元格,可以水平和垂直滚动。我试图在用户执行长按手势时提供一个简单的UIView弹出窗口,其中包含3个图标,以便用户轻松导航到UICollectionView中的两个特定单元格

我想在长按开始时弹出弹出窗口,然后用户将手指拖动到三个图标中的一个,然后释放以选择该图标

我遇到的问题是,我不知道如何让包含3个图标的视图或图标本身响应长按手势的结束

以下是UIViewController的简化:

class MyViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource {

    @IBOutlet weak var myCollectionView: UICollectionView!

    @IBAction func longTouch(_ sender: UILongPressGestureRecognizer) {
        if sender.state == .began {
            self.menu!.frame = CGRect(x: sender.location(in: self.view).x - 20,
                                     y: sender.location(in: self.view).y - 75,
                                     width: 100, height: 100)

            self.menu!.isHidden = false            
        }
        else if sender.state == .ended {
            self.menu!.isHidden = true
        }
    }

    // Popup for long touch
    var menu: UIView?

    // MARK: UIViewController

    override func viewDidLoad() {
        super.viewDidLoad()        
        self.initMenu()
    }

    // MARK:- UICollectionViewDelegate
    ...

    // MARK:- UICollectionViewDataSource
    ...

    // MARK:- UIScrollViewDelegate
    ...

    private func initMenu() -> Void {
        self.menu = UIView()
        self.menu!.isUserInteractionEnabled = true
        self.menu!.frame = CGRect(x: 0,
                                  y: 0,
                                  width: 100,
                                  height: 50)

        let longPress = UILongPressGestureRecognizer(target: self, action: #selector(menuLongPressHandler))
        self.menu!.addGestureRecognizer(longPress)

        let tapGesture = UITapGestureRecognizer(target: self, action: #selector(handleTap(sender:)))
        self.menu!.addGestureRecognizer(tapGesture)

        // There would be ImageView icons here as well, which I've left out for simplicity

        self.menu!.isHidden = true
    }

    func menuLongPressHandler() {
        print("Long Press")
    }

    func handleTap(sender: UITapGestureRecognizer) {
        print("Tap")
    }

}

在视图上方长按结束时,不会打印“点击”或“长按”。关于如何让视图捕捉长按手势的结束,有什么建议吗

我在文档中找到了为什么视图从未收到任何与LongPress相关的事件。开发者文档中写道:“UIKit会将每个触摸永久分配给包含它的视图……即使触摸位置移动到原始视图之外,触摸视图属性中的值也会保持不变。”请参阅:[link],我在文档中找到了为什么视图从未接收到任何与长按相关的事件。开发者文档中写道:“UIKit会将每个触摸永久分配给包含它的视图……即使触摸位置移动到原始视图之外,触摸视图属性中的值也会保持不变。”请参阅:[链接]