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

Posted

技术标签:

【中文标题】iOS 8 - 切换控件后,即使在纵向模式下,旋转也会使状态栏消失【英文标题】:iOS 8 - Rotation makes statusBar disappear even in portrait mode after toggling controls 【发布时间】:2014-11-28 08:37:34 【问题描述】:

ios 8 中新的自动隐藏状态栏给我带来了很多麻烦。

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

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

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

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

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

MRW > (来源:mshcdn.com)

我尝试调整 willRotate 上的状态栏,但我弄得一团糟,其中状态栏在不应该显示时会显示。我正在使用的代码:

- (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];
            
        
    


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

非常感谢任何帮助。

【问题讨论】:

【参考方案1】:

您是否使用基于 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];

就是这样!

【讨论】:

谢谢!为我指明了正确的道路!我唯一要做的就是添加另一个布尔值来检查方向是否应该显示状态栏。它就像一个魅力! 请记住这仅适用于 iOS7,对于旧版本必须使用 [[UIApplication sharedApplication] setStatusBarHidden...]。很高兴为您提供帮助! 还好我只需要支持iOS 7及更高版本就可以了!再次感谢。 我怎样才能为UITabBarController做同样的事情?【参考方案2】:

这对我有用:

- (void)viewWillLayoutSubviews 
    [[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationNone];

【讨论】:

我尝试了所有解决方案,但这个最适合我【参考方案3】:

这是 prefersStatusBarHidden 的 swift (3.0) 版本

override var prefersStatusBarHidden: Bool
    return false

你只需要将它添加到你的 ViewController

【讨论】:

【参考方案4】:
#pragma mark After and Before Oriantation Change Methods+Delegate

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation

    [[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationNone];


#pragma mark nav

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated

    [[UIApplication sharedApplication] setStatusBarHidden:NO];

这是一种简单易行的方法。

【讨论】:

"didRotateFromInterfaceOrientation" 自 iOS 8.0 起已弃用

以上是关于iOS 8 - 切换控件后,即使在纵向模式下,旋转也会使状态栏消失的主要内容,如果未能解决你的问题,请参考以下文章

即使用户在横向模式下旋转他们的设备,是不是在 Gluon API 中保持我们的应用程序处于纵向模式?

iOS 8 横向纵向模式下的自定义键盘

在 iOS 14 中锁定屏幕方向

iOS 8 自定义键盘方向更改

iOS 8 弹出框宽度 = 0 在 iPad 上仅在纵向模式下

即使纵向模式被锁定,Android 应用程序也会自动旋转到横向模式几秒钟