我使用函数定义UITableView
扩展名,将默认视图放在tableView之上。由于某种原因,以下代码行无法按预期工作。
1)未提供正确解决方案的代码
func addNoDataView() -> UIView {
let containerView = UIView(forAutoLayout: ())
self.addSubview(containerView)
containerView.backgroundColor = UIColor.black
containerView.autoPinEdge(.leading, to: .leading, of: self, withOffset: 8)
containerView.autoPinEdge(.trailing, to: .trailing, of: self, withOffset: 8)
containerView.autoPinEdge(.top, to: .top, of: self, withOffset: 40)
containerView.autoSetDimension(.height, toSize: 150)
return containerView
}
在这种情况下,预期输出将是一个黑色视图,其中tableView顶部有40个像素,带有前导和尾随边距。但是当我跑步时,我甚至无法发现视图。
2)提供正确解决方案的代码
func addNoDataView() -> UIView {
let containerView = UIView(forAutoLayout: ())
containerView.backgroundColor = UIColor.black
self.addSubview(containerView)
containerView.autoPinEdge(.leading, to: .leading, of: self, withOffset: 8)
containerView.autoPinEdge(.trailing, to: .trailing, of: self, withOffset: self.frame.width - 8)
containerView.autoPinEdge(.top, to: .top, of: self, withOffset: 40)
containerView.autoSetDimension(.height, toSize: 150)
return containerView
}
在这种情况下,我得到了预期的解决方案。即从顶部开始的黑色视图40,以及来自tableView的尾部和前缘的边距为8,高度为150。
我还有一个功能,几乎和上面一样,但差别很小(我认为)。
func addNoDataLabelToTableView() -> UILabel {
let label = UILabel(forAutoLayout: ())
self.addSubview(label)
label.textColor = UIColor.darkGray
label.textAlignment = .center
label.text = "No Data Available"
label.autoPinEdge(.trailing, to: .trailing, of: self, withOffset: 8)
label.autoPinEdge(.leading, to: .leading, of: self, withOffset: 8)
label.autoSetDimension(.height, toSize: 20)
label.autoCenterInSuperview()
return label
}
此函数将标签添加到tableView的中心,并按预期完美地运行。
tableView固定在所有4个边的超视图边缘。没问题。
但是,我无法理解为什么案例1不起作用。有人可以解释这两行之间的区别吗?
1)containerView.autoPinEdge(.trailing, to: .trailing, of: self, withOffset: 8)
无效
2)containerView.autoPinEdge(.trailing, to: .trailing, of: self, withOffset: self.frame.width - 8)
确实令人惊讶。
答案 0 :(得分:0)
您要将.containerView
添加到UITableView
...继承自UIScrollView
。
滚动视图与约束的关系略有不同,因为它们也会确定滚动视图的.contentSize
。
如果确实想要将子视图添加到表格视图中(最好将其放在顶部,而不是在,但无论如何......),必须给该子视图一个宽度和高度(除非它像UILabel,它有一个固有的大小)。
因此,您需要将addNoDataView()
func更改为:
func addNoDataView() -> UIView {
let containerView = UIView(forAutoLayout: ())
self.addSubview(containerView)
containerView.backgroundColor = UIColor.black
// inset view 8-pts from left
containerView.autoPinEdge(.left, to: .left, of: self, withOffset: 8)
// inset view 40-pts from top
containerView.autoPinEdge(.top, to: .top, of: self, withOffset: 40)
// set width to width of self (a scrollview) -16 (inset 8 from left and 8 from right)
containerView.autoMatch(.width, to: .width, of: self, withOffset: -16.0)
// set explicit height to 150
containerView.autoSetDimension(.height, toSize: 150)
return containerView
}