Состояние и макет сцены Mac Catalyst

У меня есть приложение для 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?


person BlueskyMed    schedule 07.06.2021    source источник


Ответы (1)


Событие NSWindowDidBecomeMainNotification работает, оно просто неспецифично и отправляет сообщения, если какое-либо из представлений приложения становится фокусом.

Проблема возврата макетов Mac Catalyst к макету iOS, когда viewController стал самым верхним, была решена путем переопределения viewDidLayoutSubviews и изменения там соответствующих ограничений.

person BlueskyMed    schedule 09.06.2021