SnapKit踩到"坑"

 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踩到
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
                    
                }
                
     ...
     
 }

这段代码是从约束数组中查找第一个等于需要更新的约束,说明没有找到

SnapKit踩到
SnapKit-3.png

呃呃,这两个都是height == widht * xx呀,难道不相等吗,那么我们需要看 ==
的判断条件了
SnapKit踩到
SnapKit-4.png

发现问题了 multiplier不一样导致了返回false

问题找到了

那要满足我的需求我应该怎么设置了?


SnapKit踩到
SnapKit-5.png

你可能感兴趣的:(SnapKit踩到"坑")