项目首页投稿(暂停使用,暂停投稿)

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

2017-07-07  本文已影响252人  2e919d99a871

系统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的滑动侧滑效果一致。

上一篇下一篇

猜你喜欢

热点阅读