您有几个选项,部分取决于您的UINavigationBar 的 barStyle。主要是意识到您可能不一定必须为 alpha 属性设置动画才能获得您所描述的效果。
UIBarStyleDefault 或 UIBarStyleBlackOpaque 选项 A 是将 UINavigationBar 半透明属性设置为 YES,然后为 alpha 设置动画:
navigationBar.translucent = YES; // ideally set this early, in the nib/storyboard, or viewDidLoad
...
[UIView animateWithDuration: 1.0
animations: ^{
// toggle:
navigationBar.alpha = navigationBar.alpha == 0 ? 1.0 : 0.0;
}];
在这种情况下,您的视图将位于导航栏后面,即使它的 alpha 为 1.0。这种情况的缺点是,即使使用 1.0 alpha,您也可能会在 UINavigationBar 后面看到一点视图背景颜色。此外,您的所有子视图都需要位于距离顶部 44 点的位置。
UIBarStyleDefault 或UIBarStyleBlackOpaque 选项B是在交叉溶解过渡动画中隐藏导航栏。这将公开UINavigationBar 的超级视图。如果您使用的是UINavigationController,那么您将看到UINavigationController 视图的黑色背景 - 但您可以设置UINavigationController 视图的背景颜色以匹配您的视图以获得您想要的效果:
UINavigationBar* navigationBar = self.navigationController.navigationBar;
self.navigationController.view.backgroundColor = self.view.backgroundColor;
[UIView transitionWithView: navigationBar
duration: 1.0
options: UIViewAnimationOptionTransitionCrossDissolve
animations: ^{
// toggle:
navigationBar.hidden = !navigationBar.hidden;
}
completion: nil];
如果UINavigationController 因为您隐藏了UINavigationBar 而更新了您的视图框架,则使用此解决方案需要注意的一点可能是布局问题。这很好,只是如果您的子视图锚定在左上角,它们可能会向上移动 44 像素。要解决这个问题,您可以考虑将子视图锚定到视图底部(使用弹簧或布局约束)。
UIBarStyleDefault或UIBarStyleBlackOpaque选项C是用另一个视图覆盖UINavigationBar,再次使用交叉溶解过渡动画:
UINavigationBar* navigationBar = self.navigationController.navigationBar;
[UIView transitionWithView: navigationBar
duration: 1.0
options: UIViewAnimationOptionTransitionCrossDissolve | UIViewAnimationOptionAllowAnimatedContent
animations: ^{
// toggle:
const int tag = 1111;
UIView* navOverlayView = [navigationBar viewWithTag: tag];
if ( navOverlayView == nil )
{
navOverlayView = [[UIView alloc] initWithFrame: CGRectInset( navigationBar.bounds, 0, -3 ) ];
navOverlayView.backgroundColor = self.view.backgroundColor;
navOverlayView.tag = tag;
[navigationBar addSubview: navOverlayView];
}
else
{
[navOverlayView removeFromSuperview];
}
}
completion: nil];
UIBarStyleBlackTranslucent:这个选项是最简单的,因为UINavigationBar 已经是半透明的,并且你的视图已经在它后面了。简单地为 alpha 设置动画:
[UIView animateWithDuration: 1.0
animations: ^{
// toggle:
navigationBar.alpha = navigationBar.alpha == 0 ? 1.0 : 0.0;
}];