Mac Catalyst场景状态和布局



我有一个基于现有iOS应用程序的MacOS(Big Sur(应用程序。Catalyst应用程序有4或5个场景(ViewControllers(同时打开并平铺在屏幕上。用户将在场景之间切换,与应用程序交互以创建一些合成数据。所有场景都是开放可见的(通常没有重叠,但可以根据需要四处移动(。

在使用单个代码库过渡到Catalyst环境时,我需要优化视图以优化大屏幕、多窗口环境。我通过在#if targetEnvironment下的条件编译块中的每个视图控制器的viewWillAppear方法中以编程方式启用/禁用或设置布局约束的值来实现这一点。当所有窗口场景第一次打开时,一切看起来都很棒。

问题是:当将焦点转移到另一个场景,然后返回到原始场景时,条件布局将替换为库存iOS布局。在重新获得焦点时,原始场景不会调用viewController的

viewWillAppearViewDidPear一旦场景可见,即使它不是最上面的焦点,它也始终处于前景/活动状态。它在实际关闭之前一直处于前台/活动状态。因此

在场景代理中,sceneWillEnterForegroundsceneIdBecomeActive在最初打开场景后永远不会调用。

我已经尝试使用窗口事件来检测焦点的变化:

nc.addObserver(forName: .init("NSWindowDidBecomeMainNotification"), object: nil, queue: nil) { notification in
print("This window became focused:", notification.object!)
self.turnoffConstraintForTextSideStack()
}

这个事件发布在任何打开的场景上,改变焦点,我的例程执行,将布局更改为Catalyst模式,然后,在几毫秒内,它将自己更改回iOS配置,因此在我想要的布局之后会重新绘制/重新发布。

我可以停止恢复到iOS布局吗?否则,在viewWillAppear之后,我如何提升/推动我的布局成为最终布局

NSWindowDidBecomeMainNotification事件有效,它只是非特定的,并在任何应用程序视图成为焦点时发布。

通过覆盖viewDidLayoutSubviews并修改其中的适当约束,解决了当viewController成为最顶层时Mac Catalyst布局恢复为iOS布局的问题。

最新更新