You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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'


解决方法

  1. Scene不支持frame修饰符
    WindowGroup属于Scene类型,而frame是专门给View设计的修饰符,直接给Scene调用frame会触发报错。

  2. 动态设置窗口默认大小
    如果要根据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
))
  1. 让窗口适配内部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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 04:02:37