繁体   English   中英

从屏幕边缘在UICollectionView上滑动

[英]Swipe from the edge of screen, over UICollectionView

意见方案

向大家问候!

我有 :

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

怎么了

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

我什么意思

当我尝试使用捕获触摸事件时:

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {...

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

我尝试通过添加到A_view的UIScreenEdgePanGestureRecognizer捕捉滑动

触摸视图-> touchesBegan(...)->作品

在视图上滑动-> UIScreenEdgePanGestureRecognizer->作品

触摸B视图-> touchesBegan(...)->作品

在B视图上滑动-> UIScreenEdgePanGestureRecognizer->作品

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

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

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

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

我的目标

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

覆盖该函数: optional func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> BoolA View optional func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool A View并返回适当的BOOL。
请记住,对于一个将userInteractionEnabled属性设置为true的视图,该视图中的任何触摸/手势都不会传播到父视图( 除非shouldReceive touch重写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(...)捕获方法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.begunhandlePanGestRecognizer()方法烧制。

     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)
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM