перемещение приложения в фоновый режим, вызывает viewDidLayoutSubView и создает много предупреждений с UICollectionView - PullRequest
0 голосов
/ 09 июля 2019

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

Я подумал, что это что-то с размером ячеек и попытался это исправить. Только после некоторого тестирования я заметил, что viewDidLayoutView вызывается с неправильным view.bounds, и это делает ячейку collectionView больше (по ширине), чем представление коллекции.

На данный момент мое исправление состоит в том, чтобы проверить, находится ли приложение в фоновом состоянии, и игнорировать viewDidLayoutView.

  1. почему это происходит только на iPad, а не на iPhone?
  2. Жаль, что только сейчас я увидел, как это происходит. это что-то новое в iOS?
  3. как правильно справиться с этим? Я не использую автоматическую разметку
  4. это вызов с неправильными границами, и я не хочу вычислять все кадры ячеек только для того, чтобы пользователь вернулся в ту же ориентацию.
  5. У меня такое ощущение, что я упускаю что-то очень базовое ИЛИ есть некоторые изменения в iOS, которых я не знаю.

1 Ответ

1 голос
/ 09 июля 2019

почему это происходит только на iPad, а не на iPhone?

Потому что, когда вы нажимаете Home на iPad, и приложение переходит в фоновый режим, среда выполнения делает два снимка, один вкаждую ориентацию, чтобы использовать в интерфейсе App Switcher (и в подготовке к тому, когда приложение возвращается на передний план).Это означает, что оно должно вращать приложение, которое запускает макет, и поэтому ваш viewDidLayoutSubviews называется.

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

Что ж, iPad уже давно так себя ведет.Моя работа не в том, чтобы объяснить, почему ты не заметил.По сути, вы не должны делать ничего трудоемкого в viewDidLayoutSubviews.

На данный момент мое исправление состоит в том, чтобы проверить, находится ли приложение в фоновом состоянии, и игнорировать viewDidLayoutView

Это вполне разумно.Я делаю то же самое.Например (это другой метод, но это та же идея):

override func viewWillTransition(to size: CGSize, with tc: UIViewControllerTransitionCoordinator) {
    if UIApplication.shared.applicationState == .background {
        return
    }
    // ...
}

Имейте в виду, однако, что если вы делаете макет вручную, и вы не делаете это, когда приложение входит вна заднем плане ваши снимки App Switcher могут выглядеть неправильно.Кроме того, тот факт, что вы не используете autolayout, является красным флагом.Вы, вероятно, должны использовать его.

...