美文网首页项目首页投稿(暂停使用,暂停投稿)
实现类似QQ的全屏幕侧滑返回效果

实现类似QQ的全屏幕侧滑返回效果

作者: 2e919d99a871 | 来源:发表于2017-07-07 11:17 被阅读252次

    系统navigationController的view自带的侧滑只支持左侧边缘滑动返回,这跟单手操作完全不沾边儿,纯属扯淡。但是,我发现qq的滑动返回是可以全屏操作的,这就比较舒服了。那么,就一起动手实现这个功能吧。
    首先,实现原理是这样的:
    我们给导航控制器添加一个全屏的滑动手势。用这个滑动手势,来调用系统实现的滑动返回功能,同时不要忘了禁用掉系统的滑动返回手势。

        override func viewDidLoad() {
            super.viewDidLoad()
    
            //view上添加一个侧滑的手势
            let target = self.navigationController?.interactivePopGestureRecognizer!.delegate
            let pan = UIPanGestureRecognizer(target:target,
                                             action:Selector(("handleNavigationTransition:")))
            pan.delegate = self
            self.view.addGestureRecognizer(pan)
            //禁用系统原先的侧滑返回功能
            self.navigationController?.interactivePopGestureRecognizer!.isEnabled = false
    
        }
    

    控制器遵守UIGestureRecognizerDelegate 代理,并实现下面的方法:

        func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer,
                               shouldRecognizeSimultaneouslyWith otherGestureRecognizer:
            UIGestureRecognizer) -> Bool {
                //这里,只有非根控制器才可以侧滑,根控制器禁掉
                if self.childViewControllers.count == 1 {
                    return false
                }
                return true
        }
    

    这样就实现了全屏幕滑动侧滑的功能了。

    3DA0515A39674E27A0E256D6D4602697.png

    但是呢,我把它写在我的带collectionView的控制器里发现,我在滑动collectionView的同时,还是可以侧滑的,这样的话,就容易造成不好的体验,用户滑动着collectionView有可能突然就返回到上一个页面了。

    需求大概就是我在滑动本身collectionView的时候禁止掉侧滑返回的功能。思路大概就是: 在scrollView滚动的时候代理方法返回false就可以了。那么如何判断scrollView是否正在滚动呢?一个简单粗暴的方法:

        var isScrolling: Bool = false
        func scrollViewDidScroll(_ scrollView: UIScrollView) {
            
            self.isScrolling = true
        }
        
        func scrollViewDidEndScrollingAnimation(_ scrollView: UIScrollView) {
            self.isScrolling = false
        }
        //最后代理方法改成这样
        func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer,
                               shouldRecognizeSimultaneouslyWith otherGestureRecognizer:
            UIGestureRecognizer) -> Bool {
            
            if self.isScrolling == true {
    
                return false
            }
            else {
                if self.childViewControllers.count == 1 {
                    return false
                }
                return true
            }
        }
    
    

    OK,这样,在你滑动collectionView的时候,就不能再侧滑了。完美解决,跟QQ的滑动侧滑效果一致。

    相关文章

      网友评论

        本文标题:实现类似QQ的全屏幕侧滑返回效果

        本文链接:https://www.haomeiwen.com/subject/zlslhxtx.html