在 iOS 11 上隐藏时状态栏背景消失
Status bar background disappears while hiding on iOS 11
自 iOS 11 起,我的应用程序中的状态栏在我关闭时出现异常。状态栏消失时状态栏背景变清。它在 iOS 10.
中没有这样做
我在一个非常简单的应用程序中重现了这个问题,我已将其上传到 Github:TestStatusBarBug。以下是所有相关代码:
AppDelegate.m
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[[UINavigationBar appearance] setBarTintColor:[UIColor grayColor]];
return YES;
}
@end
ViewController.m
#import "ViewController.h"
@interface ViewController () {
BOOL _statusBarHidden;
}
@end
@implementation ViewController
-(BOOL)prefersStatusBarHidden
{
return _statusBarHidden;
}
-(UIStatusBarAnimation)preferredStatusBarUpdateAnimation
{
return UIStatusBarAnimationSlide;
}
- (IBAction)toggleStatusBar {
_statusBarHidden = !_statusBarHidden;
[UIView animateWithDuration:0.35 animations:^{
[self setNeedsStatusBarAppearanceUpdate];
}];
}
@end
还有其他人遇到过这个问题吗?是否有修复或解决方法?
我查看了该项目并通过更改您的视图颜色,我能够确定您看到的白色来自带有按钮的视图(它是背景颜色)。
当您隐藏状态栏时,导航栏仍位于其原来的位置(现在太低 20 像素),因此视图的白色背景会显示出来。然后导航栏out/moves向上,白色消失
为什么这种行为在 iOS 11 中发生了变化,我不能说,但是在主要 iOS 更新期间视图操作背后的机制发生变化并不罕见。幸运的是,有一个简单的解决方案。
当您为状态栏可见性更改制作动画时,也会强制导航栏进行布局。这将使它正确定位并且动画看起来正确。
只需将用于布置导航栏的最后两行添加到您的切换代码中即可。
- (IBAction)toggleStatusBar {
_statusBarHidden = !_statusBarHidden;
[UIView animateWithDuration:0.35 animations:^{
[self setNeedsStatusBarAppearanceUpdate];
[self.navigationController.navigationBar setNeedsLayout];
[self.navigationController.navigationBar layoutIfNeeded];
}];
}
自 iOS 11 起,我的应用程序中的状态栏在我关闭时出现异常。状态栏消失时状态栏背景变清。它在 iOS 10.
中没有这样做我在一个非常简单的应用程序中重现了这个问题,我已将其上传到 Github:TestStatusBarBug。以下是所有相关代码:
AppDelegate.m
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[[UINavigationBar appearance] setBarTintColor:[UIColor grayColor]];
return YES;
}
@end
ViewController.m
#import "ViewController.h"
@interface ViewController () {
BOOL _statusBarHidden;
}
@end
@implementation ViewController
-(BOOL)prefersStatusBarHidden
{
return _statusBarHidden;
}
-(UIStatusBarAnimation)preferredStatusBarUpdateAnimation
{
return UIStatusBarAnimationSlide;
}
- (IBAction)toggleStatusBar {
_statusBarHidden = !_statusBarHidden;
[UIView animateWithDuration:0.35 animations:^{
[self setNeedsStatusBarAppearanceUpdate];
}];
}
@end
还有其他人遇到过这个问题吗?是否有修复或解决方法?
我查看了该项目并通过更改您的视图颜色,我能够确定您看到的白色来自带有按钮的视图(它是背景颜色)。
当您隐藏状态栏时,导航栏仍位于其原来的位置(现在太低 20 像素),因此视图的白色背景会显示出来。然后导航栏out/moves向上,白色消失
为什么这种行为在 iOS 11 中发生了变化,我不能说,但是在主要 iOS 更新期间视图操作背后的机制发生变化并不罕见。幸运的是,有一个简单的解决方案。
当您为状态栏可见性更改制作动画时,也会强制导航栏进行布局。这将使它正确定位并且动画看起来正确。
只需将用于布置导航栏的最后两行添加到您的切换代码中即可。
- (IBAction)toggleStatusBar {
_statusBarHidden = !_statusBarHidden;
[UIView animateWithDuration:0.35 animations:^{
[self setNeedsStatusBarAppearanceUpdate];
[self.navigationController.navigationBar setNeedsLayout];
[self.navigationController.navigationBar layoutIfNeeded];
}];
}