Как правильно обновить ограничения Auto Layout, чтобы анимации работали правильно? - PullRequest
0 голосов
/ 15 сентября 2018

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

По сути, у меня есть:

  • Два контейнера (верх: красный, низ: оранжевый)
  • Метка дочернего вида (желтая - та, которая говорит «Привет!») На нижнем виде (оранжевая)

Как видно из GIF, настройка высоты верхнего (красного) вида приводит к росту оранжевого контейнера ... что, в свою очередь, также приводит к растяжению желтого вида вместе с ним. Однако, когда красный вид становится меньше, я получаю странное поведение, когда желтый вид сразу уменьшается до размера, а не следит за анимацией оранжевого вида.

Unusual closing animation

Мои ограничения настроены следующим образом:

topViewHeightConstraint = topView.heightAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.heightAnchor, multiplier: 0.7)
NSLayoutConstraint.activate([
  // Setup the top view
  topView.topAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.topAnchor),
  topView.leadingAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.leadingAnchor),
  topView.trailingAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.trailingAnchor),
  topViewHeightConstraint!,

  // Setup the constraits for the button inside the top view
  topViewButton.centerXAnchor.constraint(equalTo: topView.centerXAnchor),
  topViewButton.bottomAnchor.constraint(equalTo: topView.bottomAnchor, constant: -20),
  topViewButton.widthAnchor.constraint(equalToConstant: 100),
  topViewButton.heightAnchor.constraint(equalTo: topViewButton.widthAnchor, multiplier: 1.0),

  // Setup the bottom view
  bottomView.bottomAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.bottomAnchor),
  bottomView.leadingAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.leadingAnchor),
  bottomView.trailingAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.trailingAnchor),
  bottomView.topAnchor.constraint(equalTo: topView.bottomAnchor),

  // Setup constraints for the label
  labelInsideBottomView.bottomAnchor.constraint(equalTo: self.bottomView.bottomAnchor),
  labelInsideBottomView.leadingAnchor.constraint(equalTo: self.bottomView.leadingAnchor),
  labelInsideBottomView.trailingAnchor.constraint(equalTo: self.bottomView.trailingAnchor),
  labelInsideBottomView.widthAnchor.constraint(equalTo: self.bottomView.widthAnchor),
  labelInsideBottomView.heightAnchor.constraint(equalTo: self.bottomView.heightAnchor)
])

Затем, чтобы изменить размер представления контейнера, я вызываю следующий код (с помощью расширения для замены ограничения множителя) я обновляю ограничение.

func moveViews() {
    if (topViewHeightConstraint.multiplier >= 0.69) {
        topViewHeightConstraint = topViewHeightConstraint.setMultiplier(multiplier: 0.5)
    } else {
        topViewHeightConstraint = topViewHeightConstraint.setMultiplier(multiplier: 0.7)
    }

    UIView.animate(withDuration: 1) {
        self.view.layoutIfNeeded()
    }
}

Может кто-нибудь увидеть что-нибудь необычное в моей настройке или предложить способ, которым я могу добиться этого без странной анимации?

Спасибо!

...