简介
一直以来都是用故事版画界面,添加限制很方便
当然,也有一些时候需要代码加限制,用原生的很麻烦,第三方库一般都选SnapKit
现在项目要求纯代码写界面,那么就更要用了
官网介绍
import SnapKit
class MyViewController: UIViewController {
lazy var box = UIView()
override func viewDidLoad() {
super.viewDidLoad()
self.view.addSubview(box)
box.backgroundColor = .green
box.snp.makeConstraints { (make) -> Void in
make.width.height.equalTo(50)
make.center.equalTo(self.view)
}
}
}
跟着官网的例子,所以一般都是用makeConstraints来添加限制
makeConstraints的问题
- 代码就是模仿官网写的,也很简单:靠右上角,宽高都是22
/// 设置按钮
settingImageView.snp.makeConstraints { make in
make.right.equalTo(-16)
make.top.equalTo(52.5)
make.width.height.equalTo(22)
}
- 那为什么会有两个宽高限制呢?明明只make了一次。下面这篇文章解释了这个问题
makeConstraints和remakeConstraints
很难保证makeConstraints只执行一次;由于多次执行,所以导致相同的约束添加了多个。
怎么解决?
用remakeConstraints代替就可以了
这个方法先清除所有的约束,然后添加约束。这样,就算是多次执行,最后约束也会只保留一份。
什么时候用makeConstraints?
那种需要两次添加才能完成确定的情况,比如先加宽高限制,再加位置限制。这种情况remakeConstraints用不了。当然,相同约束重复的问题依然存在
所以,尽量避免这种情况出现。限制集中在一个地方,一次给全,优先考虑用remakeConstraints
如何更新限制?
用updateConstraints可以更新限制
makeConstraints和updateConstraints的组合有时候会失效。makeConstraints有可能重复添加相同的限制,但是updateConstraints只能更新其中一个。这个导致updateConstraints之后没效果。原因不是updateConstraints失效,而是makeConstraints反复添加了限制
remakeConstraints和updateConstraints的组合是有效的;remakeConstraints保证了相同的限制只有一份,updateConstraints就能起效果。这个组合在动态修改视图大小的场景很有用
updateConstraints不能单独使用;如果限制不存在,调用updateConstraints会导致Assert出现,无法正常运行
小结
优先考虑使用remakeConstraints,不需要考虑重复加限制问题
必要的时候,可以考虑使用remakeConstraints和updateConstraints的组合