从屏幕边缘滑过UICollectionView

时间:2017-02-18 20:39:14

标签: ios swift uicollectionview uikit swipe

Scheme of views

向大家致以问候!

我有:

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

有什么问题?

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

我的意思是什么?

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

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {...
<视图控制器中的

我可以看到这样的结果。

我尝试通过添加到A_view的UIScreenEdgePanGestureRecognizer来抓住滑动

触摸A视图 - &gt; touchesBegan(...) - &gt;作品

在视图上滑动 - &gt; UIScreenEdgePanGestureRecognizer - &gt;作品

触摸B视图 - &gt; touchesBegan(...) - &gt;作品

在B视图上滑动 - &gt; UIScreenEdgePanGestureRecognizer - &gt;作品

触摸C视图 - &gt; touchesBegan(...) - &gt;没有工作

在C视图上滑动 - &gt; UIScreenEdgePanGestureRecognizer - &gt;没有工作

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

问题

是否有可能在A视图控制器(UIViewController)中捕获在C视图(UICollectionView)上生成的滑动/触摸事件。

我的目标

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

3 个答案:

答案 0 :(得分:0)

覆盖父optional func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool&amp;中的功能A View。返回适当的BOOL。
请注意,对于userInteractionEnabled属性设置为true的视图,该视图中的任何触摸/手势都不会传播到父视图(除非shouldReceive touch是超越说否则

答案 1 :(得分:0)

  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之外,recognizer.state方法触发时.begun不是handlePanGestRecognizer()

    func handlePanGestRecognizer(recognizer : UIScreenEdgePanGestureRecognizer){...
    

答案 2 :(得分:0)

如果需要在每个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)
    }
}
相关问题