У меня есть приложение для MacOS (Big Sur), основанное на существующем приложении для iOS. В приложении Catalyst одновременно открыты и размещены на экране 4 или 5 сцен (ViewControllers). Пользователь будет переключаться между сценами, взаимодействуя с приложением для создания составных данных. Все сцены открыты и видны (как правило, без перекрытия, но их можно перемещать по желанию).
При переходе к среде Catalyst с единой базой кода мне потребовалось оптимизировать представления для оптимизации многооконной среды большого экрана. Я делаю это путем программного включения / отключения или установки значений ограничений макета в методе viewWillAppear каждого контроллера представления в блоках условной компиляции в разделе #if targetEnvironment. Все выглядит отлично, когда все оконные сцены впервые открываются.
Вот проблема: когда фокус переходит на другую сцену, а затем возвращается к исходной сцене, условный макет заменяется стандартным макетом iOS. При восстановлении фокуса исходная сцена не вызывает viewController's
viewWillAppear или viewDidAppear, когда сцена видна, она всегда находится на переднем плане / активна, даже если она не находится на самом верху с фокусом. Он остается активным на переднем плане до фактического закрытия. следовательно
в делегате сцены sceneWillEnterForeground и sceneDidBecomeActive никогда не вызываются после первоначального открытия сцены.
Я попытался использовать событие окна для обнаружения изменения фокуса:
nc.addObserver(forName: .init("NSWindowDidBecomeMainNotification"), object: nil, queue: nil) { notification in
print("This window became focused:", notification.object!)
self.turnoffConstraintForTextSideStack()
}
Это событие публикуется в любой из открытых сцен, меняя фокус, и моя процедура выполняется, меняя макет в режим Catalyst, а затем, через несколько миллисекунд, он возвращается к конфигурации iOS, поэтому перерисовка / ретрансляция происходит после того, как я желаю макет.
Могу ли я остановить возврат к макету iOS? или в противном случае, как я могу продвинуть / сделать мой макет окончательным после viewWillAppear?