2017-09-16 81 views
6

从iOS 11开始,当我关闭它时,我的应用中的状态栏异常。当状态栏被解除时,状态栏的背景变清晰。 TestStatusBarBug:它没有在iOS的10隐藏在iOS上时状态栏背景消失11

status bar bug

我重建问题非常简单的应用程序,我已经在Github上载做到这一点。这里是所有相关代码:

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 

有其他人遇到这个问题?有没有修复或解决方法?

回答

4

我看着这个项目,通过改变你的视图颜色,我可以确定你看到的白色是来自视图中的按钮(它是背景颜色)。

当您隐藏状态栏时,导航栏仍然位于其旧位置(现在20像素过低),因此视图的白色背景显示为透过。然后导航栏布局/移动,白色消失。

为什么在iOS 11中这种行为已经发生了变化,我不能说,但对于在主要iOS更新期间更改视图操作后的机制,这种情况并不罕见。幸运的是,有一个简单的解决方案。

当您执行状态栏可见性更改的动画时,还强制导航栏进行布局。这将导致它被正确定位,并且动画看起来是正确的。

只需将这些最后两行添加到您的切换代码的​​布局导航栏。

- (IBAction)toggleStatusBar { 
    _statusBarHidden = !_statusBarHidden; 

    [UIView animateWithDuration:0.35 animations:^{ 
     [self setNeedsStatusBarAppearanceUpdate]; 
     [self.navigationController.navigationBar setNeedsLayout]; 
     [self.navigationController.navigationBar layoutIfNeeded]; 
    }]; 
} 

+0

太棒了!正是我在找的,谢谢! –

+0

谢谢!这对我也很有用:) – Grubas