安全区域布局指南不适用于 UITableView 的 BackgroundView

Posted

技术标签:

【中文标题】安全区域布局指南不适用于 UITableView 的 BackgroundView【英文标题】:Safe Area Layout Guide Not Working On UITableView's BackgroundView 【发布时间】:2018-11-21 21:33:15 【问题描述】:

我遇到的问题是,当标签应该锚定到安全区域布局指南时,它会锚定到屏幕的底部边缘。这会将标签带到 iPhone 线上方。

这是代码...

class CustomTableViewController: UITableViewController 

   override func viewDidLoad() 
       super.viewDidLoad()

       tableView.tableFooterView = UIView(frame: .zero)
       tableView.backgroundView = CustomBackgroundView()
    


.

class CustomBackgroundView: UIView 

   override init(frame: CGRect) 
       super.init(frame: frame)
       setupSubviews()
   

   required init?(coder aDecoder: NSCoder) 
       fatalError("init(coder:) has not been implemented")
   

   private func setupSubviews() 
       let label = UILabel()
       label.text = "Hello, World!"
       label.textAlignment = .center
       label.translatesAutoresizingMaskIntoConstraints = false

       addSubview(label)

       label.centerXAnchor.constraint(equalTo: centerXAnchor).isActive = true
       label.bottomAnchor.constraint(equalTo: safeAreaLayoutGuide.bottomAnchor).isActive = true
    


【问题讨论】:

你有什么问题? 我已经更新了帖子。看看吧。 【参考方案1】:

您看到这种行为是因为每个UIView 都有自己的SafeAreaLayoutGuide。默认情况下,通用 UIView 子类的 SafeAreaLayoutGuide 不包括您正在寻找的安全区域。您必须使用表格视图的 SafeAreaLayoutGuide。

你可以这样做:

class CustomBackgroundView: UIView 

    var safetyAreaBottomAnchor: NSLayoutYAxisAnchor? 
        didSet 
            guard let safetyAreaBottomAnchor = safetyAreaBottomAnchor else  return 
            label.bottomAnchor.constraint(equalTo: safetyAreaBottomAnchor).isActive = true
        
    

    private let label = UILabel()

    override init(frame: CGRect) 
        super.init(frame: frame)
        setupSubviews()
    

    required init?(coder aDecoder: NSCoder) 
        fatalError("init(coder:) has not been implemented")
    

    private func setupSubviews() 
        label.text = "Hello, World!"
        label.textAlignment = .center
        label.translatesAutoresizingMaskIntoConstraints = false

        addSubview(label)

        label.centerXAnchor.constraint(equalTo: centerXAnchor).isActive = true
     

然后在你的 UITableViewController 中这样做:

override func viewDidLoad() 
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    let customBackgroundView = CustomBackgroundView()
    tableView.tableFooterView = UIView(frame: .zero)
    tableView.backgroundView = customBackgroundView

    customBackgroundView.safetyAreaBottomAnchor = tableView.safeAreaLayoutGuide.bottomAnchor

【讨论】:

【参考方案2】:

对于这么多年后从 Google 来到这里的任何人,为了让它工作,我必须从我的自定义视图中返回 superview 的 safeAreaLayoutGuide。见下文:

class CustomBackgroundView: UIView 
    override var safeAreaLayoutGuide: UILayoutGuide 
        guard let superview = superview else  return UILayoutGuide() 
        return superview.safeAreaLayoutGuide
    

这使得所有约束都按预期工作。 确保在添加背景视图之前不要使用safeAreaLayoutGuide

func setupBackgroundViews()

    tableView.backgroundView = customBackgroundView
    anotherView.topAnchor.constraint(equalTo: customBackgroundView.safeAreaLayoutGuide.topAnchor).isActive = true

【讨论】:

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

安全区域指南未出现在 Xcode 中

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

iOS 9 和 10:使用安全区域布局指南时在屏幕顶部添加了空白区域

尽管设置了安全区域指南,但使用 XIB 显示的白色区域仍然显示空白区域

Ionic v1 安全区域不适用于 Xcode 11.5 模拟器

使用 iPhone X 的安全区域指南计算 UIView 的高度