SnapKit 更新约束导致冲突

Posted

技术标签:

【中文标题】SnapKit 更新约束导致冲突【英文标题】:SnapKit Updating Constraint causes conflict 【发布时间】:2018-11-25 17:50:38 【问题描述】:

我正在针对 ios 12 SDK、Swift 4 和 SnapKit 4.2 构建一个 iOS 应用

我想在点击按钮时更新约束,但它会与先前版本的约束产生冲突。

这是我的代码:

private var menuConstraint: Constraint?

override func updateViewConstraints() 
    super.updateViewConstraints()

    menuVc.view.snp.makeConstraints  (make) in
        self.menuConstraint = make.top.equalTo(view.snp.top).constraint
        make.right.equalTo(view.snp.right)

        make.width.equalTo(100)
        make.height.equalTo(100)
    


@objc func onMenuTap() 
    self.menuConstraint!.update(offset: 100)

onMenuTap 被调用时,我得到以下错误:

[LayoutConstraints] Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want. 
Try this: 
    (1) look at each constraint and try to figure out which you don't expect; 
    (2) find the code that added the unwanted constraint or constraints and fix it. 
(
"<SnapKit.LayoutConstraint:0xABC@MyViewController.swift#77 UIView:0xDEF.top == UIView:0xGHI.top>",
"<SnapKit.LayoutConstraint:0xABC@MyViewController.swift#77 UIView:0xDEF.top == UIView:0xGHI.top + 100.0>"
)

如您所见,先前版本的顶部约束(没有偏移)与新版本冲突。就好像它没有更新现有约束,而是创建了一个新约束。

我尝试了一些变体:

将更新行包装在 snp.updateConstraints 闭包中 首次创建约束时设置初始偏移量 获取底层LayoutConstraint并直接更新constant

我总是收到相同的错误消息。

是不是我的配置有问题?

【问题讨论】:

【参考方案1】:

不要将约束放在updateViewConstraints 中,因为它会在多次调用时重新创建约束,因此请将代码设置在viewDidLoad

【讨论】:

成功了!谢谢。我从viewDidLoad 中调用updateViewConstraints,但我将所有代码直接移动到viewDidLoad 中并修复了它。谢谢!

以上是关于SnapKit 更新约束导致冲突的主要内容,如果未能解决你的问题,请参考以下文章

更新约束不适用于 UITableView snapkit

UITableView HeaderView,FooterView 使用SnapKit布局导致约束异常

在更新触发之前执行时出现约束冲突错误

休眠更新到 OneToMany 集合的唯一约束冲突

冲突部分索引的 Postgres 唯一或排除约束无法更新票证

SQL:更新注册表会产生约束冲突