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

Я обнаружил, что при переводе приложения в фоновый режим метод traitCollectionDidChange вызывается дважды и показывает, что коллекции признаков различаются, хотя на самом деле никаких изменений не было.

- (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection;

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

BOOL hasUserInterfaceStyleChanged = [previousTraitCollection
                                     hasDifferentColorAppearanceComparedToTraitCollection:self.traitCollection];

Проблема в том, что это всегда так, и по какой-то причине коллекции признаков различаются, когда ничего не менялось. См. Ниже. UserInterfaceStyle на самом деле отличается, хотя на самом деле это не так.

Первый триггер:

previousTraitCollection:

<UITraitCollection: 0x280228c00; UserInterfaceIdiom = Phone, DisplayScale = 2, DisplayGamut = P3, HorizontalSizeClass = Compact, VerticalSizeClass = Regular, UserInterfaceStyle = Light, UserInterfaceLayoutDirection = LTR, ForceTouchCapability = Unavailable, PreferredContentSizeCategory = L, AccessibilityContrast = Normal, UserInterfaceLevel = Base>

self.traitCollection:

<UITraitCollection: 0x28023b600; UserInterfaceIdiom = Phone, DisplayScale = 2, DisplayGamut = P3, HorizontalSizeClass = Compact, VerticalSizeClass = Regular, UserInterfaceStyle = Dark, UserInterfaceLayoutDirection = LTR, ForceTouchCapability = Unavailable, PreferredContentSizeCategory = L, AccessibilityContrast = Normal, UserInterfaceLevel = Base>

Второй триггер:

previousTraitCollection:

<UITraitCollection: 0x28023b600; UserInterfaceIdiom = Phone, DisplayScale = 2, DisplayGamut = P3, HorizontalSizeClass = Compact, VerticalSizeClass = Regular, UserInterfaceStyle = Dark, UserInterfaceLayoutDirection = LTR, ForceTouchCapability = Unavailable, PreferredContentSizeCategory = L, AccessibilityContrast = Normal, UserInterfaceLevel = Base>

self.traitCollection:

<UITraitCollection: 0x28027d800; UserInterfaceIdiom = Phone, DisplayScale = 2, DisplayGamut = P3, HorizontalSizeClass = Compact, VerticalSizeClass = Regular, UserInterfaceStyle = Light, UserInterfaceLayoutDirection = LTR, ForceTouchCapability = Unavailable, PreferredContentSizeCategory = L, AccessibilityContrast = Normal, UserInterfaceLevel = Base>

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

Это ошибка Apple? Почему traitCollectionDidChange вызывается дважды, когда приложение просто переводится в фоновый режим.


person Evan    schedule 12.08.2020    source источник


Ответы (2)


На самом деле это особенность: iOS делает несколько снимков пользовательского интерфейса вашего приложения, которые будут представлены в переключателе приложений. А поскольку пользователь может переключиться в темный режим, пока ваше приложение находится в фоновом режиме, iOS делает снимки в обоих стилях интерфейса, чтобы всегда отображать правильный.

person Frank Schlegel    schedule 12.08.2020
comment
Неужели здесь что-то еще не так? Есть ли правильный способ точно определить, что режим внешнего вида изменился вместо этого, чтобы мы запускали обновления только в случае крайней необходимости? - person Evan; 14.08.2020
comment
Мне кажется правильным: система делает снимок экрана вашего пользовательского интерфейса Light, переключается на Dark (первый триггер), делает снимок экрана (за пределами экрана) и снова переключается на Light (второй триггер). И я думаю, что было бы хорошо поступить с этим сценарием соответствующим образом, а не пытаться его избежать. Или у вас проблемы? - person Frank Schlegel; 15.08.2020

проверьте, UIApplication.shared.applicationState != .background, чтобы избежать каких-либо действий во время создания снимков приложения при переходе в фоновый режим

person Tomer Even    schedule 09.11.2020