之前用Cartography去实现自动约束:
Cartography-Swift的自动布局第三方库(官方文档翻译) – Joe Shao in iOS – SegmentFault
代码为:
constrain(self.tableView) {tableView in tableView.top == tableView.superview!.top tableView.width == tableView.superview!.width tableView.centerX == tableView.superview!.centerX //tableView.bottom <= tableView.superview!.bottom //tableView.height <= tableView.superview!.height * 0.8 //tableView.height == self.tableViewHeight tableView.height == self.tvHeightConstraint.constant } |
现在想要更新高度:
在viewDidLayoutSubviews中:
constrain(self.tableView) {tableView in //tableView.height == tvHeightConstraint.constant tableView.height == newTvHeight } self.tableView.updateConstraints() |
但是结果不起效果。
还是最开始设置的固定的180,而不是更新后的197
Cartography-Swift的自动布局第三方库(官方文档翻译) – Joe Shao in iOS – SegmentFault
最后用代码:
init(personItem:PersonItem){ //can set any value here, later update constrain will override it to contentsize height self.tableViewHeight = 200 self.tvConstraintGroup = ConstraintGroup() super.init(nibName: nil, bundle: nil) } override func viewDidLoad() { super.viewDidLoad() … self.view.addSubview(self.tableView) self.tvConstraintGroup = constrain(self.tableView) {tableView in tableView.top == tableView.superview!.top tableView.width == tableView.superview!.width tableView.centerX == tableView.superview!.centerX tableView.height == self.tableViewHeight } } override func viewDidLayoutSubviews() { print("viewDidLayoutSubviews") super.viewDidLayoutSubviews() let viewHeight = self.view.bounds.height let tvContentHeight = self.tableView.contentSize.height print("viewHeight=\(viewHeight), tvContentHeight=\(tvContentHeight)") print("tableViewHeight=\(tableViewHeight)") } |
实现了更新后的效果:
高度为TableView的ContentSize的高度==真实的高度==197了:
[总结]
想要后期更新之前通过Cartography的constrain添加的约束的话,则:
最开始添加constrain时,就要保存起来:
self.tvConstraintGroup = ConstraintGroup() self.tvConstraintGroup = constrain(self.tableView) {tableView in tableView.top == tableView.superview!.top tableView.width == tableView.superview!.width tableView.centerX == tableView.superview!.centerX tableView.height == self.tableViewHeight } |
之后,去替换更新之前的约束条件:
constrain(self.tableView, replace: self.tvConstraintGroup) {tableView in tableView.top == tableView.superview!.top tableView.width == tableView.superview!.width tableView.centerX == tableView.superview!.centerX tableView.height == newTvHeight } self.tableView.layoutIfNeeded() |
注意:
1.此处的替换约束条件,是完全替换掉:
所以即使是我此处这种,只需要更新高度,其他top,width,centerX都无需更新,但是也要重新都加上,否则就只有一个height的约束:
constrain(self.tableView, replace: self.tvConstraintGroup) {tableView in // tableView.top == tableView.superview!.top // tableView.width == tableView.superview!.width // tableView.centerX == tableView.superview!.centerX tableView.height == newTvHeight } |
无法正常显示了:
2.记得更新完毕约束条件后,需要再去更新布局:
self.tableView.layoutIfNeeded()