在 iOS 11 上隐藏时状态栏背景消失

Posted

技术标签:

【中文标题】在 iOS 11 上隐藏时状态栏背景消失【英文标题】:Status bar background disappears while hiding on iOS 11 【发布时间】:2018-02-25 17:57:22 【问题描述】:

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

还有其他人遇到过这个问题吗?是否有修复或解决方法?

【问题讨论】:

【参考方案1】:

我查看了项目,通过更改您的视图颜色,我能够确定您看到的白色来自带有按钮的视图(它是背景颜色)。

当您隐藏状态栏时,导航栏仍在其旧位置(现在太低了 20 像素),因此视图的白色背景显示出来。然后导航栏展开/向上移动,白色消失。

为什么这种行为在 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 8 - 切换控件后,即使在纵向模式下,旋转也会使状态栏消失

iOS:使状态栏在非 iphoneX 上隐藏时保持其高度

Android 11 SystemUI(状态/导航栏)-状态栏下拉时图标的隐藏与通知面板的半透黑色背景

Cordova 和 iOS 8:隐藏状态栏

状态栏不会消失

在 iOS 7 中使用 Tint Color 显示导航栏时白色状态栏消失