安全区域布局指南不适用于 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 10 - iOS 9.0 [12] 之前的安全区域布局指南错误
iOS 9 和 10:使用安全区域布局指南时在屏幕顶部添加了空白区域
尽管设置了安全区域指南,但使用 XIB 显示的白色区域仍然显示空白区域