以编程方式更改自动布局约束后,视图不会更新

事先我不得不说,我实际上已经得到了我想要的可见效果,但不是以一种令人满意的方式,因为现在,限制需要被“破坏”而不是被正确更新。

我有一个ViewController持有一个UITableView。 该tableView的高度可以从0(不可见),不pipe它保存的行数是不同的。 在ViewController的viewDidLoad()中,通过将当前行数乘以行高来计算高度。

我试过的第一件事就是创build一个@IBOutlet weak var tableHeightConstraint: NSLayoutConstraint! 连接到故事板中设置的高度约束。 它只有一些随机的初始高度,但是在ViewController的viewDidLoad()更新为正确的值,如果需要的话更新视图的方法。

 tableHeightConstraint = NSLayoutConstraint(item: tableView, attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 0, constant: calculatedTableViewHeight) // At this point I've tried a variety of methods like the following two but actually none has worked for me view.layoutIfNeeded() // or view.updateConstraints() // or view.layoutSubviews() 

…甚至在tableView上的相同的方法,以确保以及所有这些都在viewDidLayoutSubviews()代替。

所以我接下来要做的是创build与上面相同的约束,但不是更新,而是将其添加到视图中: view.addConstraint(tableHeightConstraint) 。 这实际上有理想的视觉效果,但在日志中,我得到了这两个高度约束的冲突导致最初的一个突破。 我的目标是获得一个正确和干净的代码,我一直在尝试。 所以这次我首先从视图中删除约束,然后再次添加调整的约束。 在视觉上,一切都是完美的,但我仍然没有摆脱冲突的限制。

所以我的真正的问题是(除了我到目前为止做错了什么),我怎么能 – 最好 – 只是更新现有的约束,然后适当更新/重新布局视图及其子视图在任何时候,无论是当我第一次加载一个视图还是我只想在用户交互时更改一些约束。 非常感谢您的帮助!

目前,您正在分配一个新的约束,而不是更新当前的约束。 新的约束还没有被添加到视图层次结构中。

使用IBOutlet引用在IB中设置的约束的方法是一种好方法,但是不必为该var分配新的约束,只需修改该约束的常量即可:

tableHeightConstraint.constant = calculatedTableHeight

你不需要在这里调用layoutIfNeeded(),因为当你改变它们的常量时,约束会自动调用布局传递。 updateConstraints()layoutSubviews()绝对不是你想要的。