15

似乎 UITableViewController 没有安全区域布局指南来将表格视图顶部和底部边距设置为与iPhone X中底部布局的 collpes 。所有视图控制器都可以在情节提要中用于顶部和底部边距的安全区域布局指南中正常工作。除了 UITableView 控制器。

作为参考,我附上了iPhoneX的截图。在那里你可以看到字符串“小麦”不适合底部安全区域。

在此处输入图像描述

4

2 回答 2

13

我相信会发生这种情况,因为视图控制器的视图(总是占用整个屏幕大小)是tableview.

使用 aUIViewController并在其下添加一个表视图view(并添加约束以尊重底部安全区域)

或者

设置表格视图内容插图:

tableView.contentInset = UIEdgeInsetsMake(0, 0, UIApplication.shared.keyWindow!.safeAreaInsets.bottom, 0.0);

如果您使用后者并针对 11 以下的 iOS 版本,请确保通过以下方式进行验证:

     var safeAreaBottom: CGFloat = 0.0 
     if #available(iOS 11.0, *) {
         safeAreaBottom = UIApplication.shared.keyWindow!.safeAreaInsets.bottom
     }

     tableView.contentInset = UIEdgeInsetsMake(0, 0, safeAreaBottom, 0.0);

我还注意到tableviewiOS 11 中的这个属性(但没有描述:/):insetsContentViewsToSafeArea

我还没试过,但你可以试一试。也许这就是你需要的开箱即用的东西

于 2017-12-14T15:30:29.163 回答
3

这是我目前强制顶部和底部安全区域在UITableViewController. 首先,您必须将其嵌入UINavigationController(如果不需要,隐藏导航栏),然后:

override func viewDidLoad() {
    super.viewDidLoad()

    configureFakeSafeArea()
}

@available(iOS 11.0, *)
override func viewSafeAreaInsetsDidChange() {
    super.viewSafeAreaInsetsDidChange()

    topSafeAreaHeight?.constant = view.safeAreaInsets.top
    bottomSafeAreaHeight?.constant = view.safeAreaInsets.bottom
}

private var topSafeAreaHeight: NSLayoutConstraint?
private var bottomSafeAreaHeight: NSLayoutConstraint?

private func configureFakeSafeArea() {
    guard let view = navigationController?.view else {
        return
    }

    let topSafeArea = UIView()
    topSafeArea.backgroundColor = tableView.backgroundColor
    var topConstant: CGFloat = 0
    if #available(iOS 11.0, *) {
        topConstant = view.safeAreaInsets.top
    }
    topSafeAreaHeight = topSafeArea.heightAnchor.constraint(equalToConstant: topConstant)
    view.addSubview(topSafeArea, constraints: [
        topSafeArea.leadingAnchor.constraint(equalTo: view.leadingAnchor),
        topSafeArea.trailingAnchor.constraint(equalTo: view.trailingAnchor),
        topSafeArea.topAnchor.constraint(equalTo: view.topAnchor),
        topSafeAreaHeight!
    ])

    let bottomSafeArea = UIView()
    bottomSafeArea.backgroundColor = tableView.backgroundColor
    var bottomConstant: CGFloat = 0
    if #available(iOS 11.0, *) {
        bottomConstant = view.safeAreaInsets.bottom
    }
    bottomSafeAreaHeight = bottomSafeArea.heightAnchor.constraint(equalToConstant: bottomConstant)
    view.addSubview(bottomSafeArea, constraints: [
        bottomSafeArea.leadingAnchor.constraint(equalTo: view.leadingAnchor),
        bottomSafeArea.trailingAnchor.constraint(equalTo: view.trailingAnchor),
        bottomSafeArea.bottomAnchor.constraint(equalTo: view.bottomAnchor),
        bottomSafeAreaHeight!
    ])
}

很遗憾我们必须编写所有这些代码,所以如果有人知道更简单的方法来实现这一点,请告诉我们。

PS我在UIView这里使用了这个小扩展:

extension UIView {
    func addSubview(_ child: UIView, constraints: [NSLayoutConstraint]) {
        addSubview(child)
        child.translatesAutoresizingMaskIntoConstraints = false
        NSLayoutConstraint.activate(constraints)
    }
}
于 2018-03-29T21:36:13.330 回答