更新约束不适用于 UITableView snapkit

Posted

技术标签:

【中文标题】更新约束不适用于 UITableView snapkit【英文标题】:Update constraint does not work on UITableView snapkit 【发布时间】:2017-04-18 01:29:43 【问题描述】:

当我在创建约束后立即尝试更新 snapkit 约束时,我收到Updated constraint could not find existing matching constraint to update 错误。我使用的代码如下:

let directionList = UITableView()
directionList.delegate = self
directionList.dataSource = self
directionList.tag = DIRECTIONS_TABLE_TAG
self.view.addSubview(directionList)
directionList.snp.makeConstraints (make) -> Void in
    make.width.equalToSuperview()
    make.top.equalTo(self.view.snp.bottom)
    make.left.equalToSuperview()
    make.right.equalToSuperview()
    make.bottom.equalToSuperview().offset(-20)


directionList.snp.updateConstraints  (make) -> Void in
   make.top.equalTo(self.topDarkBlue.snp.bottom)

【问题讨论】:

【参考方案1】:

documentation 表示 updateConstraints 仅用于更新现有约束的常量。

如果您只更新 约束,您可以使用方法 snp.updateConstraints 而不是 snp.makeConstraints

你没有更新常量;您正在尝试将约束分配给新的锚点。

我认为你应该做的是参考顶部约束:

var topConstraint: Constraint? = nil
...
topConstraint = make.top.equalTo(self.view.snp.bottom)

稍后删除顶部约束:

topConstraint.uninstall()

然后使用另一个块来制作新的约束。

directionList.snp.makeConstraints (make) -> Void in
   make.top.equalTo(self.topDarkBlue.snp.bottom)

【讨论】:

常量是什么意思?我在 UIView.animate 中使用 updateConstraints,所以我需要将其保留为 updateConstraints。 NSLayoutConstraint 的 .constant 属性。我不明白为什么你不能对 UIView.animate 使用 makeConstraints;虽然我不清楚调用 makeConstraints 是否调用 layoutIfNeeded。如果不是,您首先调用 make 约束,然后将 self.view.layoutIfNeeded 放入动画块中以触发自动布局重新计算和帧更改。 我可以这样编码吗:让topSpace = self.topDarkBlue.snp.bottom。 make.top.equalTo(topSpace)【参考方案2】:

我迟到了,但可能对某人有帮助,最佳答案有一个错误

换行

topConstraint = make.top.equalTo(self.view.snp.bottom)

topConstraint = make.top.equalTo(self.view.snp.bottom).constraints

还有一件事

topConstraint.deactivate()

因为卸载已弃用。

【讨论】:

以上是关于更新约束不适用于 UITableView snapkit的主要内容,如果未能解决你的问题,请参考以下文章

我们如何在 uitableview 单元格中设置标签约束?

使用NSView.layoutSubtreeIfNeeded()动画自动布局约束不适用于macOS High Sierra

ContentInsets 不适用于 UITableView

有没有办法制作像 UITableView 的分隔符这样的分隔符视图?

为啥 UITableView 滚动时会更新约束?

安全区域布局指南不适用于 UITableView 的 BackgroundView