为了账号安全,请及时绑定邮箱和手机立即绑定

状态栏和导航栏出现在我的视图的边界上,在IOS 7中

状态栏和导航栏出现在我的视图的边界上,在IOS 7中

qq_笑_17 2019-06-28 15:21:37
状态栏和导航栏出现在我的视图的边界上,在IOS 7中我最近下载了Xcode在iOS 7中测试我的应用程序。我注意到并确认的第一件事是,我的视图边界并不总是调整大小来说明状态栏和导航栏。在……里面viewDidLayoutSubviews,我打印视图的界限:{{0, 0}, {320, 568}}这将导致我的内容出现在导航栏和状态栏下面。我知道我可以通过获取主屏幕的高度、减去状态栏的高度和导航栏的高度来说明自己的高度,但这似乎是不必要的额外工作。我怎样才能解决这个问题?最新情况:我找到了解决这个具体问题的办法。将导航条的半透明属性设置为否:self.navigationController.navigationBar.translucent = NO;这将修复在导航栏和状态栏下面的视图。但是,当您希望导航条是半透明的时,我还没有找到解决方案。例如,查看图片全屏,我希望导航条半透明,和视图被框在它下面。这是可行的,但是当我切换显示/隐藏导航栏时,我已经体验到了更奇怪的结果。第一个子视图(UIScrollView)得到它的界限y原点每次更改。
查看完整描述

3 回答

?
胡子哥哥

TA贡献1825条经验 获得超6个赞

您可以通过实现一个名为edgesForExtendedLayout在iOS 7 SDK中。为此,请添加以下代码,

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

您需要在您的-(void)viewDidLoad方法。

IOS 7会给布局和自定义您的外观带来一些更改。UI..视图控制器布局、色调颜色和字体的更改将影响所有乌伊基特对象在您的应用程序中。此外,对手势识别器API的增强为您提供了对手势交互的更细粒度的控制。

使用视图控制器

在IOS 7中,视图控制器使用全屏布局.同时,IOS 7对视图控制器的视图布局方式提供了更细粒度的控制。特别是,全屏布局的概念已经被细化,让视图控制器指定其视图的每个边缘的布局。

这个wantsFullScreenLayout视图控制器属性在IOS 7中不建议使用。wantsFullScreenLayout = NO在iOS 7中运行时,视图控制器可能会在意外的屏幕位置显示其内容。

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

  • EDgesfortendedLayout

这个edgesForExtendedLayout属性使用UIRectEdge类型,它除了指定“无”和“全部”之外,还指定矩形的四个边中的每一个。使用edgesForExtendedLayout指定应扩展视图的哪些边缘,而不管条形半透明。默认情况下,此属性的值为UIRectEdgeAll.

  • 扩展LayoutIncludeesOpaqueBars

如果您的设计使用不透明的条,请改进。edgesForExtendedLayout还可以通过设置extendedLayoutIncludesOpaqueBars财产..(默认值为extendedLayoutIncludesOpaqueBars.)

  • 自动调整ScrollViewInset

如果不希望自动调整滚动视图的内容嵌入,请设置automaticallyAdjustsScrollViewInsets..(默认值为automaticallyAdjustsScrollViewInsets.)

  • TopLayoutGuide,底部LayoutGuide

这个topLayoutGuidebottomLayoutGuide属性指示视图控制器视图中顶部或底部条边的位置。如果条形图应与视图的顶部或底部重叠,则可以使用InterfaceBuilder将视图相对于该条定位,方法是在topLayoutGuide或者到底层指南的顶端。(如果没有条形图应重叠视图,则topLayoutGuide与视图的顶部和bottomLayoutGuide与视图底部相同。)这两个属性都是在请求时延迟创建的。

请参考,苹果文档


查看完整回答
反对 回复 2019-06-28
?
天涯尽头无女友

TA贡献1831条经验 获得超9个赞

您不需要计算出将所有东西向下移动到什么程度,这里有一个在属性中的构建。在InterfaceBuilder中,突出显示视图控制器,然后导航到属性检查器。在这里,您将看到一些复选框旁边的单词“扩展边缘”。正如您所看到的,在第一个屏幕截图中,默认的选择是内容出现在顶部和底部的栏下,而不是在不透明的条下,这就是为什么将条形样式设置为不半透明的原因。

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


第二个屏幕截图显示了取消选中“顶部栏下”复选框时会发生什么。如您所见,视图控制器视图已被适当地向下移动,使其原点正好位于导航栏下面。


也可以通过使用-[UIViewController edgesForExtendedLayout]..这里有一个指向类引用的链接EDGEFortendedLayout,以及为了UIRectEdge

[self setEdgesForExtendedLayout:UIRectEdgeNone];


查看完整回答
反对 回复 2019-06-28
?
长风秋雁

TA贡献1757条经验 获得超7个赞

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

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

来源(在TopLayoutGuide第39页底部的一节)。


查看完整回答
反对 回复 2019-06-28
  • 3 回答
  • 0 关注
  • 638 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信