【发布时间】:2021-08-24 22:49:35
【问题描述】:
我有一个基于现有 iOS 应用程序的 MacOS(Big Sur) 应用程序。 Catalyst 应用程序有 4 或 5 个场景(视图控制器)同时打开并平铺在屏幕上。用户将在场景之间弹跳,与应用程序交互以创建一些复合数据。所有场景都是开放且可见的(一般没有重叠,但可以根据需要移动)。
在过渡到具有单一代码库的 Catalyst 环境时,我需要优化视图以优化大屏幕、多窗口环境。我通过在 #if targetEnvironment 下的条件编译块中的每个视图控制器的 viewWillAppear 方法中以编程方式启用/禁用或设置布局约束的值来做到这一点。首次打开所有窗口场景时,一切看起来都很棒。
问题出在: 当将焦点转移到另一个场景,然后返回到原始场景时,条件布局将替换为 iOS 布局。 在重新获得焦点时,原始场景不会调用 viewController 的
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 之后,如何将我的布局提升/推动为最终布局?
【问题讨论】:
标签: ios swift autolayout macos-big-sur mac-catalyst