iPhone X - space 以上安全区域问题

iPhone X - space above safe area issue

这个问题确实已经提出了与我遇到的问题完全相同的问题:

我有一个顶部有 header 的 UICollectionView,它包含几个按钮。 当 UICollectionView 向上滚动时,它会进入 header 下方,然后显示在 header 上方的 space 中。

不幸的是,我不太理解 Matt 给出的答案,如何: "It's just a matter of giving the table view controller a parent view controller with a black background. You can do that in code, or you can configure it entirely without code in the storyboard."

我很想直接联系 Matt,但没有这个选项。

编辑: 我的情节提要的屏幕截图,非常感谢有关我需要做什么的建议(请像对待狗或小狗一样说话 child'(!)

基本上,Apple 确实不支持 table 视图控制器或 collection 不是某些周围视图控制器的 child 视图控制器的视图控制器。它可以是自定义 parent 视图控制器(如@AamirR 的回答),但最常见的方法是将它放在导航界面(UINavigationController)中。现在导航栏占据了屏幕的顶部。它会自动在 iPhone X 中的 "notch" 后面长大。它会覆盖 header 上方的单元格。

如果您查看 Apple 的应用程序,它们所有 都是这样工作的。例如,查看照片应用中的时刻视图,或日历应用中的月视图。它们的顶部都有一个导航栏。

因此,将您的主题视图控制器嵌入到导航控制器中。

iPhone 5:

iPhone X:

您必须为 UICollectionViewController 创建父视图控制器并将 SubjectViewController 添加为该父视图控制器的子视图,如下所示:

class SubjectParentViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        self.view.backgroundColor = .gray

        // Add collection view as a child view controller
        let collectionViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "SubjectVC")
        collectionViewController.willMove(toParentViewController: self)
        self.addChildViewController(collectionViewController)

        let collectionView: UIView = collectionViewController.view
        collectionView.translatesAutoresizingMaskIntoConstraints = false
        self.view.addSubview(collectionView)
        collectionViewController.didMove(toParentViewController: self)

        // add auto-layout constraints to layout guides
        var guide: UILayoutGuide!

        guide = self.view.layoutMarginsGuide
        collectionView.leadingAnchor.constraint(equalTo: guide.leadingAnchor).isActive = true
        collectionView.trailingAnchor.constraint(equalTo: guide.trailingAnchor).isActive = true

        guide = self.view.safeAreaLayoutGuide
        collectionView.topAnchor.constraintEqualToSystemSpacingBelow(guide.topAnchor, multiplier: 1.0).isActive = true
        collectionView.bottomAnchor.constraintEqualToSystemSpacingBelow(guide.bottomAnchor, multiplier: 1.0).isActive = true
    }

}

通过以下 2 个步骤编辑故事板:

  1. 创建一个视图控制器,并将其 class 设置为高于自定义 class SubjectParentViewController
  2. 将所有 segues 从 SubjectViewController 移动到 SubjectParentViewController

最后,创建一个文件 SubjectParentViewController.swift 并粘贴 class

这会将 UITableViewController/UICollectionViewController 的视图设置为与布局边距和安全区域指南对齐: