Mac Catalyst 场景状态和布局

Mac Catalyst Scene Status and Layout

我有一个基于现有 iOS 应用程序的 MacOS(Big Sur) 应用程序。 Catalyst 应用程序有 4 或 5 个场景(ViewControllers)同时打开并平铺在屏幕上。用户将在场景之间跳动,与应用程序交互以创建一些复合数据。所有场景都是开放可见的(一般不会重叠,但可以随意移动)。

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

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

viewWillAppearviewDidAppear 一旦场景可见,它总是 Foreground/Active 即使它不是最上面的焦点。它保持 foreground/Active 直到真正关闭。因此

在场景委托中, sceneWillEnterForegroundsceneDidBecomeActive 在最初打开场景后永远不会被调用。

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

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

这个事件发布在任何改变焦点的开放场景上,我的例程执行,将布局更改为 Catalyst 模式,然后,在几毫秒内,它自己变回 iOS 配置,所以所以 redraw/relayout 发生在我想要的布局之后。

我可以停止恢复到 iOS 布局吗?或者做不到, 在 viewWillAppear?

之后,我如何才能 promote/push 我的布局成为最终布局

NSWindowDidBecomeMainNotification 事件有效,它只是非特定的,如果任何应用视图成为焦点,它就会发布。

当 viewController 成为最顶层时,Mac Catalyst 布局恢复为 iOS 布局的问题已通过覆盖 viewDidLayoutSubviews 并修改那里有适当的限制。