状态栏和导航栏显示在iOS 7中的视图边界上

我最近下载了Xcode 5 DP来在iOS 7中测试我的应用程序。我注意到并确认的第一件事是我的视图边界并不总是调整到状态栏和导航栏的大小。

viewDidLayoutSubviews ,我打印视图的边界:

{{0,0},{320,568}}

这会导致我的内容出现在导航栏和状态栏下方。

我知道我可以通过获得主屏幕的高度来减去状态栏的高度和导航栏的高度来解释高度,但这似乎是不必要的额外工作。

我该如何解决这个问题?

更新:

我找到了解决这个问题的解决方案。 将导航栏的半透明属性设置为NO:

self.navigationController.navigationBar.translucent = NO;

这将修复导航栏和状态栏下面的视图。

但是,当您希望导航栏变为半透明时,我还没有找到解决方案。 例如,全屏查看照片,我希望导航栏半透明,并在其下面框住视图。 这有效,但当我切换显示/隐藏导航栏时,我遇到了更奇怪的结果。 第一个子视图(UIScrollView)每次都会更改其原点的边界。


您可以通过在iOS7 SDK中实现一个名为edgesForExtendedLayout的新属性来实现此目的。 请添加以下代码来实现此目的,

if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
        self.edgesForExtendedLayout = UIRectEdgeNone;

您需要在-(void)viewDidLoad方法中添加上述内容。

iOS 7对您如何布局和自定义UI外观进行了一些更改。 视图控制器布局,色调和字体的变化会影响应用中的所有UIKit对象。 另外,手势识别器API的增强功能可以更好地控制手势交互。

使用视图控制器

在iOS 7中,视图控制器使用全屏布局。 同时,iOS 7可以让您更细致地控制视图控制器布置其视图的方式。 特别是,全屏布局的概念已经完善,可以让视图控制器指定其视图的每个边缘的布局。

在iOS 7中不推荐使用wantsFullScreenLayout视图控制器属性。如果当前指定wantsFullScreenLayout = NO ,则视图控制器在iOS 7中运行时可能会在意外的屏幕位置显示其内容。

要调整视图控制器布局视图的方式, UIViewController提供了以下属性:

  • edgesForExtendedLayout
  • edgesForExtendedLayout属性使用UIRectEdge类型,除了指定none和all以外,还指定矩形的四个边中的每一个。 使用edgesForExtendedLayout来指定视图的哪些边应该被扩展,而不管酒吧的半透明度如何。 默认情况下,此属性的值为UIRectEdgeAll

  • extendedLayoutIncludesOpaqueBars
  • 如果您的设计使用不透明条纹, edgesForExtendedLayout还可以通过将extendedLayoutIncludesOpaqueBars属性设置为NO来优化edgesForExtendedLayout 。 ( extendedLayoutIncludesOpaqueBars的默认值为NO 。)

  • automaticallyAdjustsScrollViewInsets
  • 如果您不想自动调整滚动视图的内容插页,请将automaticallyAdjustsScrollViewInsets调整滚动视图插入设置为NO 。 ( automaticallyAdjustsScrollViewInsets的默认值为YES 。)

  • topLayoutGuide,bottomLayoutGuide
  • topLayoutGuidebottomLayoutGuide属性指示视图控制器视图中顶部或底部条边的位置。 如果条纹应与视图的顶部或底部重叠,则可以使用Interface Builder通过在topLayoutGuide的底部或topLayoutGuide的顶部创建约束来定位视图相对于条的位置。 (如果没有条应该重叠视图,底部topLayoutGuide是一样的视图的顶部和顶部bottomLayoutGuide是一样的视图的底部。)请求时延后创建这两个属性。

    请参阅苹果文档


    您不必计算将所有东西向下移动的距离,这里有一个内置属性。 在Interface Builder中,突出显示您的视图控制器,然后导航到属性检查器。 在这里您会看到“延伸边缘”旁边的一些复选框。 正如你所看到的,在第一个屏幕截图中,默认选择是让内容出现在顶部和底部的小节中,但不出现在不透明的小节下,这就是为什么设置小节样式不是半透明效果。

    正如您在第一个屏幕截图中所看到的那样,导航栏下面隐藏了两个UI元素。 (我在IB中启用了线框图来说明这一点)这些元素,UIButton和UISegmentedControl都将它们的“y”原点设置为零,并且视图控制器被设置为允许内容在顶部条之下。

    在这里输入图像描述

    第二个屏幕截图显示当您取消选中“Under Top Bars”复选框时会发生的情况。 正如你所看到的,视图控制器视图已经适当地向下移动,其y原点恰好位于导航栏下方。

    在这里输入图像描述

    这也可以通过使用-[UIViewController edgesForExtendedLayout]以编程方式完成。 这里有一个指向edgeForExtendedLayout和UIRectEdge的类参考的链接

    [self setEdgesForExtendedLayout:UIRectEdgeNone];
    

    我以编程方式创建了我的视图,并最终为我工作:

    - (void) viewDidLayoutSubviews {
        // only works for iOS 7+
        if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
            CGRect viewBounds = self.view.bounds;
            CGFloat topBarOffset = self.topLayoutGuide.length;
    
            // snaps the view under the status bar (iOS 6 style)
            viewBounds.origin.y = topBarOffset * -1;
    
            // shrink the bounds of your view to compensate for the offset
            viewBounds.size.height = viewBounds.size.height + (topBarOffset * -1);
            self.view.bounds = viewBounds;
        }
    }
    

    来源(位于第39页底部的topLayoutGuide部分)。

    链接地址: http://www.djcxy.com/p/90311.html

    上一篇: Status bar and navigation bar appear over my view's bounds in iOS 7

    下一篇: Hiding a UINavigationController's UIToolbar during viewWillDisappear: