SnapKit踩到"坑"

作者: Michale_Zuo | 来源:发表于2018-08-03 14:27 被阅读842次

    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

    相关文章

      网友评论

        本文标题:SnapKit踩到"坑"

        本文链接:https://www.haomeiwen.com/subject/prvsvftx.html