无NavigationBar到有NavigationBar视图切换时的一个坑

  • 自iOS7开始,系统自带的右滑返回效果,也可以让有NavigationBar的视图切换很丝滑流畅。当然你也可能会遇到有些视图并没有NavigationBar(实际上是隐藏了),然后从这样的视图中push一个有NavigationBar的视图,这种需求很常见,实现起来也很简单,就是在不同的视图里对NavigationBar设置隐藏和显示就可以了,代码如下:
- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    self.navigationController.navigationBarHidden = YES;
}
  • 这里需要注意一点,因为设置'NavigationBar'的隐藏或显示是作用到当前'navigation controller'的,他会影响到整个navigationcontroller的NavigationBar的显示情况,所以一定要放到viewWillAppear里,不能放到viewDidLoad里。

  • 看下效果:

效果图01
无NavigationBar到有NavigationBar视图切换时的一个坑_第1张图片
效果图02
  • 嗯,好像还不错。等等,pop的时候好像右上角有个黑色的东东,那是什么鬼?用iOS7系统自带的右滑返回功能仔细看看(手指按住不松开可以慢慢移动看看效果):
无NavigationBar到有NavigationBar视图切换时的一个坑_第2张图片
效果图03
  • 哦,shit!!!告诉我这不是真的!但这就是真的!接受现实吧,骚年!
      心中一万只草泥马奔腾过后,开始寻找解决办法。
  • 解决方法如下:如下代码
 - (void)viewWillAppear:(BOOL)animated {
     [super viewWillAppear:animated];
 //    self.navigationController.navigationBarHidden = YES;
     [self.navigationController setNavigationBarHidden:YES animated:YES];
 }
  • 再看下现在的效果图:
无NavigationBar到有NavigationBar视图切换时的一个坑_第3张图片
效果图04
  • 总结1: 问题的关键在于那个animated,必须是YES才能达到理想的效果,如果换成下面的代码
    [self.navigationController setNavigationBarHidden:YES animated:NO],
    依然会有黑色底。定位到这个方法里看到这么一句话:
    If animated, it will transition vertically using UINavigationControllerHideShowBarDuration.
    大致意思是,如果
    animated=YES,
    会使用
    UINavigationControllerHideShowBarDuration进行垂直过渡。UINavigationControllerHideShowBarDuration是一个CGFloat类型的常量。
    可是我并没有很好的理解它所谓的transition vertically到底是个什么概念,也许就是后来看到的那个效果吧。
  • 总结2:
    [self.navigationController setNavigationBarHidden:YES animated:NO];
    的优先级比
    self.navigationController.navigationBarHidden = YES;
    的优先级更高, 有yes就有no

你可能感兴趣的:(无NavigationBar到有NavigationBar视图切换时的一个坑)