Ограничение обновления SnapKit вызывает конфликт

Я создаю приложение для iOS на iOS 12 SDK, Swift 4 и SnapKit 4.2

Я хочу обновить ограничение, когда я нажимаю кнопку, но это создает конфликт с предыдущей версией ограничения.

Вот мой код:

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

Другие вопросы по тегам