Может ли layoutIfNeeded вызываться только один раз при загрузке представления - например, viewDidLoad? - PullRequest
0 голосов
/ 17 февраля 2020

Высота представления в моем контроллере представления должна изменяться, когда пользователь взаимодействует с приложением. Иногда представление должно быть больше по высоте, а иногда оно должно быть короче в зависимости от количества опций, которые есть у пользователя.

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

Однако, единственный раз, когда представление фактически обновляет макет, это вызов из viewDidLoad. Все остальные вызовы моего метода не обновляют представление.

func updateContainerViewHeight(constant: CGFloat) {
    print("lets update")
    baseView.heightAnchor.constraint(equalToConstant: constant).isActive = true
    containerView.heightAnchor.constraint(equalToConstant: constant).isActive = true
    self.view.setNeedsLayout()

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

FYI print("let's update") печатает в консоли.

1 Ответ

1 голос
/ 17 февраля 2020

Как здесь

baseView.heightAnchor.constraint(equalToConstant: constant).isActive = true
containerView.heightAnchor.constraint(equalToConstant: constant).isActive = true

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

1-

var baseCon,containCon:NSLayoutConstraint!

2-

baseCon = baseView.heightAnchor.constraint(equalToConstant: constant)
baseCon.isActive = true
containCon = containerView.heightAnchor.constraint(equalToConstant: constant)
containCo.isActive = true

3- Затем играть с константой

baseCon.constant = ////
...