从屏幕边缘滑过 UICollectionView

Swipe from the edge of screen, over UICollectionView

大家好!

我有:

什么问题?

我无法在父视图控制器中捕获触摸、滑动事件。

什么意思?

当我尝试使用 :

捕捉触摸事件时
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {...

在视图控制器中我可以看到这样的结果。

我尝试通过添加到 A_view

的 UIScreenEdgePanGestureRecognizer 捕捉滑动

触摸视图 -> touchesBegan(...) -> 有效

在视图上滑动 -> UIScreenEdgePanGestureRecognizer -> 有效

触摸 B 视图 -> touchesBegan(...) -> 有效

在 B 视图上滑动 -> UIScreenEdgePanGestureRecognizer -> 有效

触摸 C 视图 -> touchesBegan(...) -> 不起作用

在 C 视图上滑动 -> UIScreenEdgePanGestureRecognizer -> 不起作用

我注意到我可以在 C 视图控制器中捕获触摸事件。

问题

是否有可能在 A 视图控制器 (UIViewController) 中捕获 swipe/touch 在 C 视图 (UICollectionView) 上产生的事件。

我的目标

我的目标是制作 SideBar 视图,当我尝试在 C 视图 (UICollectionView) 上捕捉屏幕边缘的滑动时,它只是在里面滚动,但我想在手指开始时打开 SideBar

覆盖函数:optional func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool 在父 A View & return 适当的 BOOL 中。
请记住,对于 userInteractionEnabled 属性设置为 true 的视图,该视图中的任何 touches/gestures 都不会传播到父视图(,除非 shouldReceive touch 被覆盖,以其他方式表示 )

  1. 我已将 UIGestureRecognizerDelegate 添加到 A View viewController 的父 类。

    class A_viewController: UIViewController,UIGestureRecognizerDelegate{...
    
  2. 我已将 UIScreenEdgePanGestureRecognizer 添加到 A view - 父视图。

    let rec = UIScreenEdgePanGestureRecognizer(target: self, action: #selector(handlePanGestRecognizer))
    rec.edges = .left
    rec.delegate = self
    A_view.addGestureRecognizer(rec)
    
  3. 使用方法gestureRecognizerShouldBegin(...)捕捉边缘滑动,并调用handlePanGestRecognizer(...)方法产生动作。如果 gestureRecognizerUIScreenEdgePanGestureRecognizer 则执行操作。

    func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool
    {
         if gestureRecognizer is UIScreenEdgePanGestureRecognizer
         {
             handlePanGestRecognizer(recognizer: gestureRecognizer as! UIScreenEdgePanGestureRecognizer)
         }
         return false
    }
    
  4. 除此之外 recognizer.state.rawvalue = 0,所以当 handlePanGestRecognizer() 方法触发时 recognizer.state 不是 .begun

    func handlePanGestRecognizer(recognizer : UIScreenEdgePanGestureRecognizer){...
    

如果您需要在每个 scrollView 上识别边缘滑动手势。 (UICollectionView 是一个 UIScrollView)

extension UIScrollView {
    open override func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
        print("gesture recognizer should begin")
        print(gestureRecognizer)
        let app = UIApplication.shared.delegate as? AppDelegate
        if let view = app?.window?.rootViewController?.view, !(gestureRecognizer is UIScreenEdgePanGestureRecognizer) {
            let location = gestureRecognizer.location(in: view)
            if location.x < view.frame.maxX * 0.05 || location.x > view.frame.maxX * 0.95 {
                return false
            }
        }
        return super.gestureRecognizerShouldBegin(gestureRecognizer)
    }
}