在桌面视图中,快速拖尾约束不能按预期工作
我有一个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个象素的黑色图。但是当我跑步时,我甚至无法看到视图。它提供正确的解决方案
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
}
在这种情况下
2)代码,我得到预期的解决方案。即来自顶部的黑色视图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边的超视图边缘。没有问题与此。
但是,我无法理解为什么Case 1不起作用。有人能解释这两行之间的区别吗?
1)containerView.autoPinEdge(.trailing, to: .trailing, of: self, withOffset: 8)
没有工作
2)containerView.autoPinEdge(.trailing, to: .trailing, of: self, withOffset: self.frame.width - 8)
这并令人惊奇地工作。
您正在将.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
}
啊,这是因为scrollView和它的必要性有contentSize。不知何故,我从脑袋里滑了出来。感谢DonMag为您的时间。 –
在你的情况2,如果你只使用-8为withOffset:是的结果一样吗? – 3stud1ant3