Родная система макетов анимирует - PullRequest
0 голосов
/ 19 мая 2019

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

Иерархия контроллера:

  • UITabBarController
    • UINavigationControler
      • UIViewController
      • UIPageViewController
        • UICollectionView
        • GoogleMap

Видимые анимированные материалы: (без нахождения внутри блока анимации)

  • макет:
    • метки и представления, перемещающиеся через ячейку к месту назначения (ячейка с собственным размером)
    • горизонтальные элементы представления коллекции поступают изугол до их положения
  • слой:
    • радиус угла от 0 до height/2 анимированный.
  • вид:
    • isHidden иногда не работает.Он находится внутри UIStackView и когда скрывает его, он просто выталкивает его из стека (видимый из-за ошибки, странно, но это так)
    • установка заголовка для анимированных кнопок (метод setTitle:forState:.А не мигающая анимация, какая-то морфируемая анимация)

Где находятся коды компоновки и стиля? сначала после viewDidLoad и внутри источника данных didSet наблюдатель

А как насчет потоков? Я дважды проверил все работы пользовательского интерфейса, отправленные в основную очередь, и Main Thread Checker включен.

- Показать мне код !!!

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

1 Ответ

0 голосов
/ 19 мая 2019

Я обнаружил проблему примерно через 3 дня исследования и получил ответ всего за пару минут:

В некоторой точке кода был блок анимации:

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

Я не знаю почему, но это привело к тому, что все макеты были анимированы до конца жизни контроллера (даже после завершения анимации)

Так что, чтобы обойти это, я попробовал это:

UIView.animate(withDuration: 1, animations: {
    DispatchQueue.main.async {
       self.view.layoutIfNeeded()
    }
})

Проблема решена НО !!! появилась новая проблема: Оригинальная анимация вообще не работает!

Так что для окончательного решения я немного изменил код:

DispatchQueue.main.async {
    UIView.animate(withDuration: 1, animations: {
       self.view.layoutIfNeeded()
    })
}

И, к счастью, это работает!Я знал:

все пользовательские интерфейсы должны выполняться в основном потоке

, а также блоки анимации не захватывают себя и выполняют свою работу в текущем потоке.но странным образом.

...