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-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-3.png

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

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

问题找到了

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


SnapKit-5.png
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容