iOS 8 - 在切换控件后,旋转使statusBar即使在纵向模式下也会消失

Phi*_*lip 16 objective-c statusbar orientation

我在iOS 8中新的自动隐藏状态栏时遇到了很多麻烦.

在我的应用程序中,我有一个视图,当用户点击一次时,导航栏和状态栏消失.

在横向时,状态栏会自行隐藏,对我来说没问题.我只需要在纵向模式下使用它.

但问题是当设备是横向并且显示条形时,当用户点击两次以切换条形(如此显示),并且以纵向模式转动设备时,状态栏仍然是隐藏的.

基本上我需要能够隐藏statusBar而不会干扰它在iOS 8上的自然行为,所以我回顾一下这个场景:

  • 用户使用tabBar和NavigationBar以及statusBar输入所述视图;
  • 在视图中点击一次,条形消失
  • 用户旋转设备,statusBar没有出现 - 好的,我想要这个
  • 用户再次点击以显示栏 - StatusBar仍然隐藏,好的.
  • 用户从横向旋转到纵向和..
  • statusBar仍然隐藏 - 不行.

MRW> http://rack.2.mshcdn.com/media/ZgkyMDEzLzA2LzEzL2Y0L1B1Y2suODkyZGIuZ2lmCnAJdGh1bWIJMTIwMHg5NjAwPg/c6538ddb/a38/Puck.gif

我试图在willRotate上调整statusBar,但是我弄得一团糟,其中statusBar在不应该的时候可见.我正在使用的代码:

- (BOOL)prefersStatusBarHidden
{
    return statusBarHidden;
}

-(void)toggleBars:(UITapGestureRecognizer *)gesture{
    CATransition *animation = [CATransition animation];
    animation.type = kCATransitionFromBottom;
    animation.subtype = kCATransitionFromTop;
    animation.duration = .2f;
    [animation setTimingFunction:[CAMediaTimingFunction functionWithName: kCAMediaTimingFunctionEaseInEaseOut]];


    BOOL toggleNavigationBar = self.navigationController.navigationBarHidden;
    [self.navigationController.navigationBar.layer addAnimation:animation forKey:nil];
    [self.navigationController setNavigationBarHidden:!toggleNavigationBar animated:YES];



    BOOL toggleTabHidden = self.tabBarController.tabBar.hidden;
    if(![[[NSUserDefaults standardUserDefaults] objectForKey:@"showTabBar"]isKindOfClass:[NSNull class]]){
        if([(NSNumber*)[[NSUserDefaults standardUserDefaults] objectForKey:@"showTabBar"]boolValue])
        {
            [self.tabBarController.tabBar.layer addAnimation:animation forKey:nil];
            [self.tabBarController setHideTabBar:!toggleTabHidden animated:YES];
        }
    }

    statusBarHidden = [UIApplication sharedApplication].statusBarHidden;
    [[UIApplication sharedApplication] setStatusBarHidden:!statusBarHidden withAnimation:UIStatusBarAnimationSlide];
    [self setNeedsStatusBarAppearanceUpdate];


    if (IS_IOS8){
        if (UIInterfaceOrientationIsLandscape(self.interfaceOrientation)){
            if (statusBarHidden){
                [[UIApplication sharedApplication] setStatusBarHidden:YES];
            }
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

我正在考虑设置一个标志,当在横向和状态下隐藏statusBar时,在旋转时它会触发statusBar.没有成功,显然......

任何帮助高度赞赏.

hyb*_*ttt 27

你在使用基于UIViewController的状态栏外观吗?如果你实施prefersStatusBarHidden我假设你是.

现在,

[[UIApplication sharedApplication] setStatusBarHidden:!statusBarHidden withAnimation: UIStatusBarAnimationSlide];
Run Code Online (Sandbox Code Playgroud)

不应该使用基于UIViewController的状态栏外观.

您只需要从prefersStatusBarHidden方法返回不同的值并调用setNeedsStatusBarAppearanceUpdate以通知应用程序返回值已更改.

因此,要更改状态栏可见性,您应该这样做

@property (nonatomic, assign) BOOL hideStatusBar;

- (BOOL)prefersStatusBarHidden 
{
    return self.hideStatusBar;
}

- (void)toggleBars:(UITapGestureRecognizer *)gesture 
{
    ... hide navbar and tabbar ...

    self.hideStatusBar = ! self.hideStatusBar;
    [self setNeedsStatusBarAppearanceUpdate];
}
Run Code Online (Sandbox Code Playgroud)

就是这样!


Sta*_*ich 6

这对我有用:

- (void)viewWillLayoutSubviews {
    [[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationNone];
}
Run Code Online (Sandbox Code Playgroud)

  • 我尝试了所有的解决方案,但这个对我来说是最好的 (2认同)