iOS 7状态栏与NavigationBar重叠问题

47

我在我的应用程序中有一个视图控制器,在storyboard中拖动了一个导航栏。它在iOS 6中工作得很好,但在iOS 7中看起来像这样:

ios 7 status bar nav var

状态栏和导航栏不应该重叠。我在stackoverflow上看到了很多这样的问题,但对我没有太大帮助。

一些问题说我应该使用“self.edgesForExtendedLayout = UIRectEdgeNone;”,但这并不起作用。有些人说我应该删除导航栏并将其嵌入导航控制器中,但由于我的程序实现方式,我无法这样做。有些解决方案建议使用视图大小等,但对我也没有起作用。

什么是可以帮助我解决此问题的一件事。先谢谢!

更新: 我已将视图控制器嵌入uinavigation控制器中。删除了手动添加的导航栏。现在在storyboard中看起来还好,但运行时会显示如下内容:

iOS 7 Navigation Status bar

它显示当前位于其后面即父视图控制器的另一个视图控制器的文本。意味着它现在是透明的。有人能指出我做错了什么吗?


我已经在这个帖子上回答了https://dev59.com/fGMl5IYBdhLWcg3wknsT#19044681 - Desert Rose
您的应用程序下方没有显示任何内容吗? - Desert Rose
在状态栏下方有一个导航栏,下方是一个文本视图。但现在导航栏区域是透明的,并显示其后面的另一个视图控制器已经呈现了它。 - AJ112
我花了一天时间尝试 SO 和苹果开发者论坛提出的各种解决方案 - 嵌入导航控制器并使用它的导航栏是唯一看起来还算像样的方法。我提交了一个 RADAR,鼓励其他遇到这个问题的人也这么做。 - RyanR
2017年,完整详细的解决方案:https://dev59.com/j2Ik5IYBdhLWcg3wrv24#41622164 - Fattie
17个回答

1
在早期的iOS版本中,窗口从状态栏之后开始,而在iOS 7中,窗口从0像素开始。在早期版本中,视图高度为460(iPhone 4s及更早版本)和548(iPhone 5),但在iOS 7中,视图高度为480(iPhone 4s及更早版本)和568(iPhone 5及更高版本),因此您必须在20像素后开始视图排列或者从20像素开始。您可以在rootviewcontroller或所有viewcontroller中编写以下代码以设置视图距离20px。
#define IOS7_HEIGHT             64

- (void)viewDidLayoutSubviews {
    NSString *currSysVer = [[UIDevice currentDevice] systemVersion];
    if ([currSysVer compare:@"7.0" options:NSNumericSearch] != NSOrderedAscending)
    {
        CGRect frame=[self.view frame];
        if (frame.origin.y!=IOS7_HEIGHT) {

            frame.origin.y = IOS7_HEIGHT;
            frame.size.height -= IOS7_HEIGHT;
            [self.view setFrame:frame];
            [self.view layoutSubviews];
        }
    }
}

这里的高度为64,因为状态栏占用了20个单位,导航栏占用了44个单位。尝试以下代码,它将帮助您解决问题。


1
对于那些在实现@Masterfego的解决方案时遇到问题的人(这也是官方的解决方案,但我在Xcode 6.3和自动约束方面遇到了问题),这是我所做的:
我有一个UIViewController并添加了一个导航栏。我选择了导航栏并添加了一个64px的高度约束。稍后我们会看到一个警告,说明导航栏将更高(但这就是我们想要的)。最后,您可以看到状态栏看起来很好,并且与导航栏具有相同的颜色。 :)
PS:我还不能发布图片。

1

0

当从我的MainViewController打开全屏ModalViewController时,我遇到了问题,当用户从ModalViewController返回MainViewController时,NavigationBar的位置会发生变化。

我注意到的问题是当用户返回MainViewController时,状态栏高度没有被包括在内。请在返回ViewController之前和之后调试并检查您的NavigationBar的起源。

// This method will adjust navigation bar and view content.
    private func adjustNavigationControllerIfNeeded() {

        var frame = self.view.frame
        let navigationBarHeight = self.navigationController!.navigationBar.frame.size.height

        if(frame.origin.y == navigationBarHeight && !UIApplication.shared.isStatusBarHidden) { 

   // If status bar height is not included but it is showing then we have to adjust 
      our Navigation controller properly

            print("Adjusting navigation controller")
            let statusBarHeight = UIApplication.shared.statusBarFrame.height

            frame.origin.y += statusBarHeight // Start view below navigation bar
            frame.size.height -= statusBarHeight
            self.view.frame = frame

            self.navigationController!.navigationBar.frame.origin.y = statusBarHeight // Move navigation bar
        }
    }

并从viewWillAppear方法中调用它 -

override func viewWillAppear(_ animated: Bool) {

        super.viewWillAppear(animated)
        self.adjustNavigationControllerIfNeeded()
}

0

这是最好的答案。 但我想知道如何使用 Storyboard 并在其上拖动 UINavigationBar。 当我实现了代理方法并将返回结果设置为 UIBarPositionTopAttached 时,它并没有起作用。

- (void)viewDidLoad{
    self.navigationbar.delegate = self;
}
- (UIBarPosition)positionForBar:(id<UIBarPositioning>)bar{
    NSLog(@"Got it");
    //
    //    CGRect frame = self.navigaitonBar.frame;
    //
    //    frame = CGRectMake(0, 20, CGRectGetWidth(frame), CGRectGetHeight(frame));
    //    self.navigaitonBar.frame = frame;
    //
    //    NSLog(@"frame %f",frame.origin.y);
    return UIBarPositionTopAttached;
}

只需使用 - (UIBarPosition)positionForBar:(id<UIBarPositioning>)bar; 方法即可将导航栏位置更改为状态栏下方。 - rbbtsn0w

0
如果您使用Xcode 6和Swift,您可以这样做:
  1. 打开您的应用程序的info.plist文件。
  2. 添加一个ViewControllerBasedStatusBarAppearance布尔键,如果它不存在,并将值“NO”分配给它。
  3. 添加“状态栏样式”键,如果它不存在,并将“不透明黑色样式”值选择给它。

0

过渡指南提供了更多的细节。你能否更新你的答案,告诉我如何解决这个问题。谢谢! - AJ112

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接