这将是最简单的改变alpha,但是Apple’s guidelines state:
Prior to iOS v5.0,when used in conjunction with a navigation
controller,there are only a handful of direct customizations you can
make to the navigation bar. Specifically,it is alright to modify the
barStyle,tintColor,and translucent properties,but you must never
directly change UIView-level properties such as the frame,bounds,
alpha,or hidden properties directly.
该语言有点怪异,就像在iOS 5之前所说的那样,但是它表示你不允许直接更改Alpha值,并且它从来没有说明你现在可以被允许.
我不希望我的应用被拒绝.
如何像状态栏一样淡出导航栏?
解决方法
它应该非常直截了当:使用UIView transitionWithView执行导航栏的隐藏状态和非隐藏状态之间的交叉淡入淡出,由公共API setNavigationBarHidden:animated:设置.事实上,这有助于“退出”导航栏,但如果出现问题,则会退缩.问题是导航栏将滑动到位,无论UIView transitionWithView:不能动画化动画属性(例如框架),除非您指定UIViewAnimationOptionAllowAnimatedContent.
对我来说,这说明内部的UINavigationController将UINavigationBar重新定位在一个动画块内,无论是否在调用setNavigationBarHidden:animated:中指定了动画.当动画:设置为NO时,此动画块的持续时间可能设置为“0”.
解决方案是在横向渐变过渡之前将导航栏设置为可见(无动画).这确保导航栏在正确的位置开始交叉淡入淡出,并且交叉淡入淡出只会显示新的非隐藏状态.
我的示例项目是标准的单一视图应用程序.在故事板上是一个UINavigationController,它是入口点.我将这个控制器的UINavigationBar的条形设置为黑色半透明(类似于照片应用程序).导航控制器的rootViewController是一个简单的UIViewController,UIImageView填充了整个界限(也就像Photos应用程序).我在视图中添加了一个UITapGestureRecognizer,以在视图控制器中调用以下代码:
- (IBAction) onShowHideNavbar: (id) sender { BOOL hide = !self.navigationController.navigationBarHidden; if ( !hide) { [self.navigationController setNavigationBarHidden: hide animated: NO]; } [UIView transitionWithView: self.navigationController.view duration: 1 options: UIViewAnimationOptionTransitionCrossDissolve animations: ^{ [self.navigationController setNavigationBarHidden: hide animated: NO]; } completion: nil ]; }
所有这一切都说,我不认为你会遇到任何麻烦(苹果拒绝),直接弄乱了UINavigationBar的隐藏或alpha属性.文档警告不要触摸这些文件,因为它们由UINavigationController管理并改变它们可能没有看到后果.但在我的意见中,他们是公开的API,因此使用它们不应该被拒绝.