SnapKit是纯代码开发写约束的利器。平时在开发过程中会用到这个库。今天把以前遇到的"坑"(可能是开发者不规范的使用)分享一下。
问题复原:首先给一个view设置宽度,宽度是根据高度来设置的
(以下只是示例代码,为了说明问题,实际开发场景要比这个复杂)
self.vi.snp.makeConstraints { (maker) in
maker.left.right.equalToSuperview()
maker.top.equalTo(100)
maker.height.equalTo(self.vi.snp.width).multipliedBy(0.5)
}
当某种情况下,需要更新高度
self.vi.snp.updateConstraints { (maker) in
maker.height.equalTo(self.vi.snp.width).multipliedBy(0.9)
}
兴致勃勃的run项目,准备等待奇迹的发生的时候,然而程序挂起了
SnapKit-1.png
what,找不到约束?这让我一时摸不着头脑呀,那么为什么会发生这样的事情了?仔细看看报错原因,大致意思是我这是的height == width * 0.9这个约束找不到可以匹配的约束来支持update
我明明不是height都是从width的0.5->0.9吗?问题出在哪里, 我一步一步的找原因
SnapKit-2.png
那从问题发生的地方反推回去
guard let updateLayoutConstraint = existingLayoutConstraint else {
fatalError("Updated constraint could not find existing matching constraint to update: \(layoutConstraint)")
}
updateLayoutConstraint
是为nil,那么为什么为nil了再往上走
for layoutConstraint in layoutConstraints {
let existingLayoutConstraint = existingLayoutConstraints.first {
$0 == layoutConstraint
}
...
}
这段代码是从约束数组中查找第一个等于需要更新的约束,说明没有找到
呃呃,这两个都是height == widht * xx呀,难道不相等吗,那么我们需要看
==
的判断条件了
SnapKit-4.png
发现问题了
multiplier
不一样导致了返回false
问题找到了
那要满足我的需求我应该怎么设置了?
SnapKit-5.png
网友评论