繁体   English   中英

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

[英]View is not updating after changing auto-layout constraints programmatically

事先我不得不说我实际上得到了我想要的可见效果,但不是令人满意的方式,因为现在,约束需要被“打破”而不是正确更新。

我有一个ViewController,它包含一个UITableView。 tableView的高度可以从0(不可见)到它所拥有的行数不等。 通过将当前行数乘以行的高度,在ViewController的viewDidLoad()中计算高度。

我尝试过的第一件事是创建一个@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()

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

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

目前,您正在分配新约束,而不是更新当前约束。 新约束也未添加到视图层次结构中。

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

tableHeightConstraint.constant = calculatedTableHeight

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM