objective-c - iOS 8 - 即使在切换控件后的纵向模式下,旋转也会使状态栏消失

标签 objective-c orientation statusbar

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

在我的应用中,我有一个 View ,当用户点击一次时,导航栏和状态栏就会消失。

在横向模式下,状态栏会自行隐藏,这对我来说很好。我只需要纵向模式。

但问题是,当设备处于横向状态并显示状态栏时,当用户点击两次以切换状态栏(如此显示),然后将设备转为纵向模式时,状态栏仍然隐藏。

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

  • 用户使用 tabBar、NavigationBar 和 statusBar 进入所述 View ;
  • 在 View 中点击一次,条形消失
  • 用户旋转设备,状态栏没有出现 - 好的,我想要这个
  • 用户再次点击以显示栏 - StatusBar 仍然隐藏,好的。
  • 用户从横向旋转到纵向并且..
  • statusBar 仍然隐藏 - 不正常。

MRW >
(来源:mshcdn.com)

我曾尝试调整 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];
            }
        }
    }

}

我正在考虑设置一个标志,当状态栏在景观中隐藏并且所有控件都在那里时,在旋转时它会触发状态栏。显然没有成功..

非常感谢任何帮助。

最佳答案

您使用的是基于 UIViewController 的状态栏外观吗? 如果您实现了 prefersStatusBarHidden,我假设您是。

现在,

[[UIApplication sharedApplication] setStatusBarHidden:!statusBarHidden withAnimation: UIStatusBarAnimationSlide];

不适用于基于 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];
}

就是这样!

关于objective-c - iOS 8 - 即使在切换控件后的纵向模式下,旋转也会使状态栏消失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26176362/

相关文章:

objective-c - 如何获取 NSTableView 中选定行内的元素?

iOS iAd 与 UIToolBar 的集成问题

objective-c - 我如何获得 cocoa 中给定字体系列支持的字体

ios - 有什么方法可以检测手机平放时的角度吗?

android - 在android中横向和纵向处理多个选项卡

ios - 更改状态栏的样式

ios - 使用 drawRect : 设置 UIView backgroundColor

iphone - MonoTouch iPhone 方向不匹配

java - 如何在 map View 中获得透明状态栏?

iphone - 改变状态栏高度的iPhone Activity有哪些?