这是一个有趣的解决方案。
它应该非常简单:用于UIView transitionWithView
在导航栏的隐藏和非隐藏状态之间执行交叉淡入淡出,由公共 API 设置setNavigationBarHidden:animated:
。事实上,这适用于“淡出”导航栏,但将其淡入会出现问题。问题是导航栏会滑入到位,不管事实UIView +transitionWithView:
是否不为动画属性(例如frame
)设置动画,除非您指定UIViewAnimationOptionAllowAnimatedContent
.
对我来说,这说明无论是否在调用中指定了动画,动画块内部都会UINavigationController
重新定位。当设置为时,此动画块的持续时间可能设置为“0” 。UINavigationBar
setNavigationBarHidden:animated:
animate:
NO
解决方案是在交叉淡入淡出过渡之前将导航栏设置为可见(无动画)。这确保了导航栏在正确的位置开始交叉淡入淡出,并且交叉淡入淡出只会显示新的非隐藏状态。
我的示例项目是一个标准的单视图应用程序。故事板上有一个UINavigationController
,它是入口点。我将此控制器的条形样式设置为UINavigationBar
黑色半透明(类似于照片应用程序)。导航控制器rootViewController
是一个简单UIViewController
的UIImageView
填充整个边界(也像照片应用程序)。我在视图上添加了一个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 属性而遇到任何麻烦(Apple Rejection)。文档警告不要触摸这些,因为它们由 UINavigationController 管理,更改它们可能会产生看不见的后果。但在我看来,它们是公共 API,因此使用它们不应成为拒绝的理由。