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