Я немного опоздал на вечеринку Auto Layout, но пару дней пытался понять, почему некоторые из моих анимированных изменений ограничений не всегда работают и не выдают никаких ошибок в консоли. .
По сути, у меня есть:
- Два контейнера (верх: красный, низ: оранжевый)
- Метка дочернего вида (желтая - та, которая говорит «Привет!») На нижнем виде (оранжевая)
Как видно из GIF, настройка высоты верхнего (красного) вида приводит к росту оранжевого контейнера ... что, в свою очередь, также приводит к растяжению желтого вида вместе с ним. Однако, когда красный вид становится меньше, я получаю странное поведение, когда желтый вид сразу уменьшается до размера, а не следит за анимацией оранжевого вида.
Мои ограничения настроены следующим образом:
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()
}
}
Может кто-нибудь увидеть что-нибудь необычное в моей настройке или предложить способ, которым я могу добиться этого без странной анимации?
Спасибо!