如何在iPad的Stage Manager模式下禁用应用窗口调整大小?
iPad端Stage Manager窗口尺寸限制实现方法
iPad端设置Stage Manager窗口的固定/最小尺寸,API和你用的macCatalyst版本几乎一致,不需要额外的条件编译,直接针对UIWindowScene设置即可,注意需要iOS 16及以上版本(Stage Manager从iOS16开始支持)。
核心实现代码
在App启动后的场景初始化逻辑里添加以下代码(比如SceneDelegate的对应方法,或者SwiftUI的App结构体中):
// 遍历所有已连接的窗口场景 UIApplication.shared.connectedScenes.compactMap { $0 as? UIWindowScene }.forEach { windowScene in // 设置固定尺寸(最小=最大) windowScene.sizeRestrictions?.minimumSize = CGSize(width: 480, height: 640) windowScene.sizeRestrictions?.maximumSize = CGSize(width: 480, height: 640) // 如果只需要最小尺寸,只设置minimumSize即可: // windowScene.sizeRestrictions?.minimumSize = CGSize(width: 320, height: 480) }
不同项目类型的放置位置
UIKit项目(SceneDelegate):
把代码放在scene(_:willConnectTo:options:)方法里,确保窗口场景初始化时就应用限制:func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { guard let windowScene = (scene as? UIWindowScene) else { return } // 设置尺寸限制 windowScene.sizeRestrictions?.minimumSize = CGSize(width: 480, height: 640) windowScene.sizeRestrictions?.maximumSize = CGSize(width: 480, height: 640) // 其他窗口初始化逻辑... }SwiftUI项目:
可以在视图出现后遍历所有场景设置限制:@main struct YourApp: App { var body: some Scene { WindowGroup { ContentView() .onAppear { UIApplication.shared.connectedScenes.compactMap { $0 as? UIWindowScene }.forEach { windowScene in windowScene.sizeRestrictions?.minimumSize = CGSize(width: 480, height: 640) windowScene.sizeRestrictions?.maximumSize = CGSize(width: 480, height: 640) } } } } }
关键注意点
- 部署目标必须设为iOS 16.0+,否则
sizeRestrictions属性会报错; - 支持多窗口的应用,遍历所有
connectedScenes能确保每个窗口都应用尺寸规则; - 固定尺寸需要同时把
minimumSize和maximumSize设为相同值,只设minimumSize的话用户可放大窗口但不能小于该尺寸。
内容的提问来源于stack exchange,提问作者Ксения Смирнова
相关产品推荐
相关产品推荐

