iOS开发tips-UINavigationBar的切换效果

2020-01-21 02:25:41王冬梅

实现全屏侧滑返回首先想到的是使用iOS7新增的UIViewControllerInteractiveTransitioning,这是苹果推荐的方式,既然转场可以自定义,当然添加个手势返回也不会很复杂。但是这种方式的最大问题就是实现起来并没有系统滑动那般丝滑,想要实现类似系统的切换效果还要好好下一番功夫。于是就有朋友想到自定义一个拖动手势添加到全屏,而真正侧滑的操作使用系统的方法,这也是目前很多app普遍使用的方式。在下面的demo5中演示了这一方法:


class FullScreenPoNavigationViewController: UINavigationController,UIGestureRecognizerDelegate {

 override func viewDidLoad() {
 super.viewDidLoad()

 let popGesture = self.interactivePopGestureRecognizer
 let popTarget = popGesture?.delegate
 let popView = popGesture!.view!
 popGesture?.isEnabled = false

 let popSelector = NSSelectorFromString("handleNavigationTransition:")
 let fullScreenPoGesture = UIPanGestureRecognizer(target: popTarget, action: popSelector)
 fullScreenPoGesture.delegate = self

 popView.addGestureRecognizer(fullScreenPoGesture)
 }

 func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
 if self.childViewControllers.count > 1 {
  return true
 }
 return false
 }

}

iOS,tips,UINavigationBar,切换

当然上面的实现并不太完美,多次滑动之后有时候还会出现bug,这需要一些条件控制,不过你可以利用Swizzle黑魔法将其应用到系统中所有的导航控制器中,这一点可以参考sunnyxx的开源库FDFullscreenPopGesture

总结

方案1自定义完整的导航栏和方案2仅仅自定义导航栏背景基本是当前国内绝大多数app的做法。但是类似于网易云音乐和微信等应用也对方案1和方案2做了改进,微信的改进上面已经提到了,网易云音乐使用的方式类似于方案1,但是它并没有自定义导航栏而是巧妙的在导航栏外嵌套一个UINavigationController来实现(由于UINavigationController无法直接push另一个UINavigationController,所以外面还要再多嵌套一个UIViewController),这种方式规避了自定义导航栏的麻烦,但是也不是没有缺点,例如如果你不是很清楚其中的结构,想要拿到当前控制器的导航控制器时可能会事与愿违。 除了上述方式还有一些其他方式实现导航栏的切换效果,例如通过截图方式,但相对比较麻烦而且和原有实现方式也有所偏离,在此不再赘述,有兴趣可以继续探索。

代码下载:tips-UINavigationBar的切换效果

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持ASPKU。


注:相关教程知识阅读请移步到IOS开发频道。