【问题标题】:Swipe from the edge of screen, over UICollectionView从屏幕边缘滑动到 UICollectionView
【发布时间】:2017-02-18 20:39:13
【问题描述】:

大家好!

我有:

  • 视图 - UIViewController 的主视图
  • B 视图 - 是 UIView 和 A 视图的子视图 (A_view.addsubview(B_view))
  • C 视图 - 是 UICollectionView 和 A 视图的子视图 ...

什么问题?

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

这是什么意思?

当我尝试使用以下方法捕捉触摸事件时:

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) 中捕获 C 视图 (UICollectionView) 上产生的滑动/触摸事件。

我的目标

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

【问题讨论】:

    标签: ios swift uicollectionview uikit swipe


    【解决方案1】:

    如果您需要在每个滚动视图上识别边缘滑动手势。 (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)
        }
    }
    

    【讨论】:

      【解决方案2】:

      重写函数:optional func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -&gt; Bool 在父 A View 中并返回适当的 BOOL。
      请记住,对于 userInteractionEnabled 属性设置为 true 的视图,该视图中的任何触摸/手势都不会传播到父视图(除非 shouldReceive touch 被覆盖以另有说明 em>)

      【讨论】:

        【解决方案3】:
        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){...
          

        【讨论】:

          猜你喜欢
          • 2013-12-16
          • 1970-01-01
          • 1970-01-01
          • 2016-02-25
          • 2015-12-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多