安全区域布局指南不适用于情节提要中的 UITableViewController

Posted

技术标签:

【中文标题】安全区域布局指南不适用于情节提要中的 UITableViewController【英文标题】:Safe area layout guide doesn't working for UITableViewController in storyboard 【发布时间】:2018-05-28 17:28:57 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

我相信这是因为视图控制器的视图(总是占据整个屏幕大小)是tableview

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

设置表格视图内容插入:

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

如果您使用后者并且目标 ios 版本低于 11,请确保您通过以下方式进行验证:

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

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

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

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

【讨论】:

我试过insetsContentViewsToSafeArea,但似乎没有帮助。根据这个article,默认是`true'。 但是按照您的示例设置 tableView.contentInset 很有效! 你确定这在 iOS 12.2 中仍然有效吗?我不能让它工作。将insetsContentViewsToSafeArea 设置为false 时也不起作用。【参考方案2】:

这是我目前在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!
    ])

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

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

extension UIView 
    func addSubview(_ child: UIView, constraints: [NSLayoutConstraint]) 
        addSubview(child)
        child.translatesAutoresizingMaskIntoConstraints = false
        NSLayoutConstraint.activate(constraints)
    

【讨论】:

以上是关于安全区域布局指南不适用于情节提要中的 UITableViewController的主要内容,如果未能解决你的问题,请参考以下文章

Xcode 10 - iOS 9.0 [12] 之前的安全区域布局指南错误

如何避免 iPhone X 上的视图剪辑

pushViewController 似乎不适用于情节提要和 QLPreviewController

UIScrollview 不适用于情节提要

awakeFromNib() 不适用于模拟指标

iPhone X 中的底部边距使用情节提要