Изменения ограничения AutoLayout для анимированного подпредставления - PullRequest
0 голосов
/ 17 сентября 2018

Многочисленные учебники по анимации ограничений AutoLayout предлагают обновить свойство константы ограничения и затем вызвать layoutIfNeeded() в блоке анимации.

Моя ситуация немного сложная.У меня есть мнение, что дома 3 подпредставления.Высота этого суперпредставления не фиксирована - он рассчитывается как сумма высот его подпредставлений.В некоторых случаях я прошу одно из этих 3 подпредставлений переключить его высоту (она изменяется от 0 до 30, т.е. я хочу плавно скрыть и показать ее).Код похож на это:

// In superview
subview1.isVisibleInContext = !subview1.isVisibleInContext

// In subview
class MySubview: UIView {
    @IBOutlet var heightConstraint: NSLayoutConstraint!

    var isVisibleInContext = false {
        didSet {
            updateHeight()
        }
    }

    func toggleHeight() {
        let newHeight = isVisibleInContext ? 30 : 0
        layoutIfNeeded()
        heightConstraint.constant = newHeight
        UIView.animate(withDuration: 0.8) {
            self.layoutIfNeeded()
        }
    }
}

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

Я хочу видеть высоту суперпредставления постепенноувеличивается / уменьшается по мере увеличения или уменьшения числа его подпредставлений.

Пожалуйста, кто-нибудь направит меня в правильном направлении.Любая помощь приветствуется.

Большое спасибо!

Ответы [ 2 ]

0 голосов
/ 27 сентября 2018

Первое, что было неверно в моем подходе, было выполнение self.layoutIfNeeded(). Изучив проблему, я узнал, что мне нужно выполнить ее на суперивью, например:

self.superview?.layoutIfNeeded()

Это также не сработало по причине. Основной проблемой в этом случае было то, что представление, которое имело 3 подпредставления внутри, само было подпредставлением представления. Поэтому, чтобы это работало, мне пришлось использовать следующий код:

self.superview?.superview?.layoutIfNeeded()

Определенно не хорошо, что подпредставление должно знать иерархию представлений, однако это работает.

0 голосов
/ 23 сентября 2018

Блок анимации должен быть в UIView, который содержит 3 MySubviews.Внутри класса MySubview вы обновляете только константу ограничения высоты:

В подпредставлении

func toggleHeight() {
   let newHeight = isVisibleInContext ? 30 : 0
   heightConstraint.constant = newHeight
}

Затем в UIView, который содержит 3 MySubviewsВы анимируете изменение:

В Superview

func toggleHeight(with subview: MySubview) {
   subview.toggleHeight()
   UIView.animate(withDuration: 0.8) {
      self.view.layoutIfNeeded()
   }
}

enter image description here

...