如何在iOS6中停止状态栏覆盖导航栏

Posted

技术标签:

【中文标题】如何在iOS6中停止状态栏覆盖导航栏【英文标题】:How to stop the status bar covering the navigation bar in iOS6 【发布时间】:2013-02-05 17:33:55 【问题描述】:

这是我的问题....

这发生在:

    状态栏使用按钮淡出。 从横向旋转 180 度到倒置横向。 状态栏使用按钮淡出。 - 它现在覆盖了导航栏。

切换状态栏可见性的按钮代码:

- (IBAction)toggleBar:(id)sender

    NSLog(@"View Frame : %@", NSStringFromCGRect(self.view.frame));

    // Toggle status bar visiblity
    BOOL isStatusBarHidden = [[UIApplication sharedApplication] isStatusBarHidden];
    [[UIApplication sharedApplication] setStatusBarHidden:!isStatusBarHidden
                                            withAnimation:UIStatusBarAnimationFade];

视图始终报告其框架为 480 x 288。

ios 5 上,通过停止填充空间的旋转来解决这个问题。

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation

    if ([[UIApplication sharedApplication] isStatusBarHidden])
    
        float oldAlpha = self.navigationController.navigationBar.alpha;
        self.navigationController.navigationBar.alpha = 0.01;
        [[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationNone];

        double delayInSeconds = 0.0;
        dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
        dispatch_after(popTime, dispatch_get_main_queue(), ^(void)
            self.navigationController.navigationBar.alpha = oldAlpha;
            [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationNone];
        );
    

    return UIInterfaceOrientationIsLandscape(interfaceOrientation);

这在 iOS 6 上不起作用,因为没有调用 shouldAutorotateToInterfaceOrientation。但是,使用它的替换:willRotateToInterfaceOrientation 也不起作用。有什么想法吗?

【问题讨论】:

shouldAutorotateToInterfaceOrientation 的替换不是willRotateToInterfaceOrientation。是supportedInterfaceOrientations @rmaddy 同意,但在 ios 5 中它有另一个目的 - 让您知道它即将旋转屏幕。 这不是真的。对shouldAutorotateToInterfaceOrientation 的调用绝不表示视图控制器即将旋转。其目的是询问是否允许某些轮换。 willRotateToInterfaceOrientation 方法用于指示轮换实际上即将发生。请记住,这些方法是关于视图控制器,而不是屏幕。 @rmaddy - 好吧,显然你是对的! willRotateToInterfaceOrientation 也是在 iOS 5 上调用的,我还以为是 iOS 6 的新方法。 willRotateToInterfaceOrientation 从 iOS 2.0 开始就存在了。 【参考方案1】:

切换状态栏后,再次设置self.view.frame。

【讨论】:

这不起作用。帧始终报告为 480 x 268(旋转之前/之后/切换状态栏)。设置框架没有效果。谢谢你的回答。 你检查我的另一个解决方案了吗?【参考方案2】:

在IOS6,你应该使用这些方法。看看这些。

- (BOOL)shouldAutorotate

    //returns true if want to allow orientation change
    return TRUE;

- (NSUInteger)supportedInterfaceOrientations
   
     //decide number of origination tob supported by Viewcontroller.
     return UIInterfaceOrientationMaskAll;


- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation

    //from here you Should try to Preferred orientation for ViewController 

【讨论】:

【参考方案3】:

好的,答案是在willRotateToInterfaceOrientation 上使用相同的技巧,我曾说过这在我的问题中不起作用,但我再次尝试并成功了。

- (void) willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration

    if ([[UIApplication sharedApplication] isStatusBarHidden])
    
        [[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationNone];

        double delayInSeconds = 0.0;
        dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
        dispatch_after(popTime, dispatch_get_main_queue(), ^(void)
            [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationNone];
        );
    

【讨论】:

【参考方案4】:

我打电话后

dismissViewControllerAnimated

这个方法,然后调用

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

出现这个问题。

当我打电话时 [[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationSlide]; 首先,没问题。

【讨论】:

以上是关于如何在iOS6中停止状态栏覆盖导航栏的主要内容,如果未能解决你的问题,请参考以下文章

如何更改模态视图 iOS 6 上的状态栏

iPhone X 上的导航栏不覆盖状态栏

iOS 7 导航栏隐藏内容

系统覆盖不覆盖状态栏和导航栏 Android

如何制作一个可以覆盖导航栏的UIView?

在 iOS 7 中,如果我使用 `prefersStatusBarHidden` 方法隐藏状态栏,导航栏会缩小/失去高度。我可以停止这种行为吗?