UITabBarController的子视图控制器重叠状态栏问题

4
  • Xcode 7(编程软件)
  • iOS Target 9.3(操作系统版本)
  • Swift 2(编程语言)

我在Xcode中创建了一个新的选项卡应用程序:

enter image description here

我将第一个生成的UIViewController超级视图的背景更改为灰色,然后运行应用程序,在这个截图中可以看到第一个UIView被状态栏覆盖:

enter image description here

我阅读了许多文章,特别是关于iOS 7的状态栏分配空间的文章。
我还在apple.developer.com上看到了以下引用:
“使用不透明的UINavigationController或UITabBarController的应用程序会自动将其内容保留在状态栏下方。”
总的来说,这个链接在apple.developer.com网站上似乎有点过时。
但是,话虽如此,我期望UITabBarController加载选项卡子视图时为状态栏分配空间,就像在UITabBarController的Storyboard中显示的那样。

enter image description here

我尝试在我的UITabBarController类中添加以下内容:

override func viewDidLoad() {
    super.viewDidLoad()

    self.edgesForExtendedLayout = UIRectEdge.None
    self.automaticallyAdjustsScrollViewInsets = false;
}

我查看了许多Stackoverflow的问题和答案帖子,我发现这个人在Stackoverflow上问了同样的问题:使用UITabBarController但状态栏覆盖视图 我知道如何将约束添加到每个父视图的顶部布局指南中,但我正在尝试避免添加新的顶层UIView,因为我的现有UIViewControllers选项卡中都有UILabels、UIButtons、UICollections等控件在SuperView中,我无法在Xcode Storyboard中向SuperView添加Top Layout Guide的约束。 对于SuperView,我似乎无法通过控制拖动来添加顶级约束:

enter image description here


你是否想要实现 iOS 7 之前的外观? - SeanCAtkinson
不,我并不是试图实现一个 iOS7 之前的应用程序,我只是试图在任何子选项卡中利用 UITabBarController 分配给状态栏的空间,苹果文档在我的问题中引用说它会这样做,UITabBarController 的故事板图片也在我的 Xcode 截图中显示了状态栏的空间。 - Brian Ogden
好的,我认为他们所说的自动将内容保持在状态栏下面是指自动布局指南会将您的内容附加到视图时自动考虑状态栏。因此,如果您在非全屏模式下使用它,则内容将简单地附加到UIView的顶部。但是,在这种情况下,它是全屏的,因此自动布局会自动提供一个垂直布局指南,添加额外的20像素以使您的内容保持在状态栏下方。有意义吗? - SeanCAtkinson
是的,这很有道理,谢谢@SeanCAtkinson,什么时候应用程序不会全屏? - Brian Ogden
如果您将其添加为另一个视图控制器的子项,则可能无法全屏显示。例如,您可能具有UIViewController作为窗口的rootViewController。然后,创建一个childView来充当容器,其框架设置为所需的大小。最后,将您的UITabBarViewController作为原始UIViewController的childViewController添加,并将tabViewcontroller的视图作为容器视图控制器的子视图添加。 - SeanCAtkinson
2个回答

2
在iOS中,自动布局会为你处理这个问题。虽然视图延伸到状态栏下方,但是你需要将约束修正为“垂直间距顶部布局指南”的距离为0,并且你会发现它会按照预期的方式位于状态栏下方。
请参考以下图片:enter image description here enter image description here

谢谢您的回答,我知道如何将此约束添加到每个 UiViewController 中的每个顶部视图,但我正在尝试避免为许多我的 UiViewControlers 添加新的顶级视图,这些视图都是选项卡,其中所有 UILabel、UIButtons、UICollections 等都在 SuperView 中,而我无法添加约束。 - Brian Ogden
你不需要添加另一个顶层视图 - 为什么不能将约束添加到项目中? - SeanCAtkinson
请查看我的问题更新,我在底部添加了一张图片,但是当我控制拖动时无法将约束添加到顶部布局指南。 - Brian Ogden
是的,那是从您的父视图中获取的,它自动链接到其父视图的顶部 - 在这种情况下是选项卡控制器,它位于您的UIWindow内部。您想要实现的确切效果是什么? - SeanCAtkinson
根据我在问题中引用的苹果文档,Right 和 Superview 都是 UITabBarController 的子视图,该视图会自动将子选项卡内容放置在状态栏下方。 - Brian Ogden

0

所以我通过@SeanCAtkinson的帮助发现事情正在按照应该的方式进行。我需要为任何UIViewController添加一个约束,这个UIViewController是我的UITabBarController的子控制器。

我认为任何作为选项卡的子控制器都会显示为为状态栏分配空间。我认为UITabBarController正在这样做,基于它在Xcode 7 Storyboard中的外观:

enter image description here

从屏幕截图中可以看出,UITabBarController意味着选项卡将显示在浅灰色的正方形内,您可以看到状态栏下方有顶部“guid”。

UITabBarController并不会阻止状态栏重叠子选项卡,无论是UIViewControllers、UICollectionViewControllers还是UITableViewControllers等。您必须使用顶部布局指南约束您的子选项卡。

特别令人困惑的是,SuperView不能有顶部布局指南约束,SuperView将始终全屏。


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