状态栏和导航栏显示在我的视图上';ios7中的s界

状态栏和导航栏显示在我的视图上';ios7中的s界,ios,ios7,Ios,Ios7,我最近下载了5DP,用iOS 7测试我的应用程序。我注意到并确认的第一件事是,我的视图边界并不总是根据状态栏和导航栏调整大小 在viewdilayoutsubviews中,我打印视图的边界: {0,0},{320568} 这将导致我的内容出现在导航栏和状态栏下方 我知道我可以通过计算主屏幕的高度,减去状态栏的高度和导航栏的高度来计算高度,但这似乎是不必要的额外工作 如何解决此问题 更新: 我已经找到了解决这个具体问题的办法。将导航栏的半透明属性设置为否: self.navigationContr

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

viewdilayoutsubviews
中,我打印视图的边界:

{0,0},{320568}

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

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

如何解决此问题

更新:

我已经找到了解决这个具体问题的办法。将导航栏的半透明属性设置为否:

self.navigationController.navigationBar.translucent = NO;
这将修复视图在导航栏和状态栏下方的边框


然而,我还没有找到一个修复的情况下,当你想导航栏是半透明的。例如,在全屏查看照片时,我希望导航栏是半透明的,并且视图要在其下方加框。这是可行的,但当我切换显示/隐藏导航栏时,我体验到了更奇怪的结果。第一个子视图(UIScrollView)的边界y原点每次都会更改。

如果希望视图具有半透明的导航栏(这有点不错),则必须设置contentInset或类似设置

我是这样做的:

// Check if we are running on ios7
if([[[[UIDevice currentDevice] systemVersion] componentsSeparatedByString:@"."][0] intValue] >= 7) {
      CGRect statusBarViewRect = [[UIApplication sharedApplication] statusBarFrame];
      float heightPadding = statusBarViewRect.size.height+self.navigationController.navigationBar.frame.size.height;

      myContentView.contentInset = UIEdgeInsetsMake(heightPadding, 0.0, 0.0, 0.0);
}

可以通过在ios7sdk中实现名为
edgesForExtendedLayout
的新属性来实现这一点。请添加以下代码以实现此目的

if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
        self.edgesForExtendedLayout = UIRectEdgeNone;
您需要在
-(void)viewDidLoad
方法中添加上述内容

iOS 7对布局和自定义应用程序的方式进行了一些更改 用户界面的外观。视图控制器布局、色调的更改 颜色和字体会影响应用程序中的所有UIKit对象。在里面 此外,对手势识别器API的增强为您提供了更好的 对手势交互的粒度控制

使用视图控制器

在iOS 7中,视图控制器使用全屏布局。同时,, iOS 7使您能够更精确地控制视图控制器的运行方式 展示其观点。特别是全屏布局的概念 已进行优化,以允许视图控制器指定每个视图的布局 它的视野边缘

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

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

  • 边缘扩展布局
edgesForExtendedLayout
属性使用
UIRectEdge
类型, 它指定矩形的四条边中的每一条,除了 指定none和all。使用
edgesForExtendedLayout
指定 应延伸视图的边,而不考虑条形图的半透明性。通过 默认情况下,此属性的值为
UIRectEdgeAll

  • 扩展布局包括不透明条
如果您的设计使用不透明条,请通过 还将
extendedlayoutincludesopaquebar
属性设置为 。(ExtendedLayoutCludeSopaqueBars的默认值为

  • 自动调整滚动视图插图
如果您不希望滚动视图的内容插入自动 已调整,将
自动调整滚动视图插图设置为否。(修订)
automaticallyaadjustsscrollviewsinsets
的默认值为YES

  • 顶部布局指南、底部布局指南
topLayoutGuide
bottomLayoutGuide
属性表示 视图控制器视图中顶部或底部栏边的位置。 如果条形图应与视图的顶部或底部重叠,则可以使用 界面生成器,通过创建 约束到
topLayoutGuide
底部或顶部 底部布局指南。(如果没有任何条形图与视图重叠,则
topLayoutGuide
与视图顶部和视图顶部相同
bottomLayoutGuide
与视图底部相同。)两者 属性是在请求时惰性创建的


请参阅,

您不必计算要将所有内容向下移动多远,这有一个内置属性。在界面生成器中,高亮显示视图控制器,然后导航到属性检查器。在这里,您将看到“延伸边”旁边的一些复选框。如您所见,在第一个屏幕截图中,默认选择的内容显示在顶部和底部栏下,而不是不透明栏下,这就是为什么将栏样式设置为“非半透明”对您有效的原因

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

第二个屏幕截图显示了取消选中“顶栏下”复选框时发生的情况。如您所见,“视图控制器”视图已适当下移,以便其y原点位于导航栏的正下方

这也可以通过使用
-[UIViewController edgesForExtendedLayout]
以编程方式实现。这里有一个链接到
[self setEdgesForExtendedLayout:UIRectEdgeNone];
self.navigationController.navigationBar.barStyle = UIBarStyleBlackOpaque;
if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
    self.edgesForExtendedLayout = UIRectEdgeNone;   // iOS 7 specific
- (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;
    }
}
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0)
- (void) viewDidLayoutSubviews {
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
        CGRect viewBounds = self.view.bounds;
        CGFloat topBarOffset = self.topLayoutGuide.length;
        viewBounds.origin.y = topBarOffset * -1;
        self.view.bounds = viewBounds;
    }
}
- (void)viewDidLoad
{
   [super viewDidLoad];
   float systemVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
   if (systemVersion >= 7.0) {
      self.edgesForExtendedLayout = UIRectEdgeNone;
   }
}
- (void)viewDidLoad
{
    [super viewDidLoad];
    float systemVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
    if (systemVersion >= 7.0) {
        self.edgesForExtendedLayout = UIRectEdgeBottom;
    }
}
  if ([[[UIDevice currentDevice] systemVersion] floatValue]<= 7) {
self.edgesForExtendedLayout = UIRectEdgeNone;
 }
override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    self.edgesForExtendedLayout = UIRectEdge.None
}
override func viewDidLoad() {
    super.viewDidLoad()

    edgesForExtendedLayout = []
}
override func viewWillAppear(_ animated: Bool) {
    self.edgesForExtendedLayout = []
}
if #available(iOS 11.0, *) {} else {
  self.edgesForExtendedLayout = []
  self.navigationController?.view.backgroundColor = .white
}