SwiftUI中能否动态设置visionOS窗口宽度?
问题:给WindowGroup设置frame报错
我尝试像给View设置frame那样给WindowGroup设置frame,代码如下:
@main struct i2ElevatorApp: App { private var portraitSize : CGSize = CGSize(width: 400, height: 600) private var landscapeSize : CGSize = CGSize(width: 600, height: 400) private var landscapeSize2x : CGSize = CGSize(width: 800, height: 600) let sharedState = SharedState() var body: some Scene { WindowGroup { ContentView().environmentObject(sharedState) }.defaultSize(portraitSize) WindowGroup(id: "SubTransformationView", for: MyData.self) { data in if let data = data.wrappedValue { CardView(cardIndex: data.intValue, cardType: data.stringValue) .environmentObject(sharedState) } else { EmptyView() } } .defaultSize(portraitSize) .frame(width: CGFloat(400 * (sharedState.aaa.count + 1))) } }
但运行时报错:
类型为'some Scene'的值没有成员'frame'
解决方法
Scene不支持
frame修饰符WindowGroup属于Scene类型,而frame是专门给View设计的修饰符,直接给Scene调用frame会触发报错。动态设置窗口默认大小
如果要根据sharedState动态调整窗口的默认尺寸,把计算逻辑直接放到.defaultSize参数中即可:
WindowGroup(id: "SubTransformationView", for: MyData.self) { data in if let data = data.wrappedValue { CardView(cardIndex: data.intValue, cardType: data.stringValue) .environmentObject(sharedState) } else { EmptyView() } } .defaultSize(CGSize( width: 400 * (sharedState.aaa.count + 1), height: portraitSize.height ))
- 让窗口适配内部View尺寸
如果希望窗口自动适配内部内容的大小(支持macOS 13+/iOS 16+),可以使用.windowResizability(.contentSize),同时给内部的CardView设置frame,窗口会自动跟随调整:
WindowGroup(id: "SubTransformationView", for: MyData.self) { data in if let data = data.wrappedValue { CardView(cardIndex: data.intValue, cardType: data.stringValue) .environmentObject(sharedState) .frame(width: CGFloat(400 * (sharedState.aaa.count + 1))) } else { EmptyView() } } .defaultSize(portraitSize) .windowResizability(.contentSize)
内容的提问来源于stack exchange,提问作者János
相关产品推荐
相关产品推荐

