Анимация изменений изменений с помощью setNeedsLayout - PullRequest
0 голосов
/ 18 февраля 2019

Стандартный способ анимации изменений ограничений:

// Change constraints like:
someConstraint.constant = 100 

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

Однако я наблюдал сеанс WWDC 2015 по многозадачности на iPad, и в конце он сказал, что не используйте layoutIfNeeded в анимационных блоках, используйте setNeedsLayout вместо.Однако я всегда думал, что это будет означать, что компоновка происходит позже в цикле выполнения и так за пределами блока анимации.Возможно, он помнит, что он был вызван в анимационном блоке?

Я попытался заменить layoutIfNeeded на setNeedsLayout в моем коде, и это, похоже, сработало.Это просто совпадение, и мы на самом деле должны анимировать изменения автопоставки с помощью setNeedsLayout?

Slide from WWDC video showing to use setNeedsLayout instead

1 Ответ

0 голосов
/ 20 февраля 2019

Документация для layoutIfNeeded() гласит:

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

Документация для setNeedsLayout() состояний:

Вызовите этометод в главном потоке вашего приложения, когда вы хотите настроить макет подпредставлений представления.Этот метод записывает запрос и сразу же возвращается.Поскольку этот метод не вызывает немедленного обновления, а вместо этого ожидает следующего цикла обновления, его можно использовать для аннулирования макета нескольких представлений до обновления любого из этих представлений.Такое поведение позволяет консолидировать все обновления макета в один цикл обновления, который обычно лучше для производительности.

setNeedsLayout() откладывает макет для всех подпредставлений представления до следующего циклаrunloop, тем самым объединяя все изменения в подходящее время, вместо того, чтобы отступать от процесса и заставлять компоновку происходить мгновенно.Да, вы должны использовать setNeedsLayout() вместо layoutIfNeeded() в функции UIView.animate.Будьте хорошим гражданином, если это возможно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...