如何解决Xcode14.1中macOS SwiftUI视图尺寸无法固定的问题?
Xcode 14.1 macOS SwiftUI 视图尺寸无法缩小的解决方案
在Xcode 14.1开发macOS SwiftUI应用时,会遇到这类问题:即便给视图设置了frame和fixedSize修饰符,切换到更小尺寸时,视图/窗口并不会按预期缩小,而是保持之前的较大状态。这是因为macOS的窗口尺寸由NSWindow管理,Xcode14.1中SwiftUI的布局优先级行为有变化,导致窗口不会自动跟随视图frame调整缩小。
解决方法1:设置窗口可跟随内容尺寸调整
在WindowGroup中添加.windowResizability(.contentSize)配置,让窗口允许根据内容尺寸动态调整,同时给视图设置最小尺寸约束:
@main struct YourApp: App { var body: some Scene { WindowGroup { ContentView() .frame(minWidth: 200, minHeight: 200) } .windowResizability(.contentSize) // 关键配置,允许窗口按内容尺寸调整 } } struct ContentView: View { @State private var sizeOfWindow: CGFloat = 400.0 var body: some View { VStack { Image(systemName: "globe") .imageScale(.large) .foregroundColor(.accentColor) Text("Hello, world!") Button("update") { sizeOfWindow = sizeOfWindow == 200 ? 400 : 200 print(sizeOfWindow) } } .frame(width: sizeOfWindow, height: sizeOfWindow) .fixedSize() .background(Color.gray.opacity(0.2)) // 方便直观查看视图尺寸变化 } }
解决方法2:直接控制NSWindow实例尺寸
如果方法1不生效,可以直接获取当前窗口实例,调用setContentSize强制修改窗口尺寸:
struct ContentView: View { @State private var sizeOfWindow: CGFloat = 400.0 @State private var currentWindow: NSWindow? var body: some View { VStack { Image(systemName: "globe") .imageScale(.large) .foregroundColor(.accentColor) Text("Hello, world!") Button("update") { sizeOfWindow = sizeOfWindow == 200 ? 400 : 200 // 强制设置窗口内容尺寸 currentWindow?.setContentSize(NSSize(width: sizeOfWindow, height: sizeOfWindow)) print(sizeOfWindow) } } .frame(width: sizeOfWindow, height: sizeOfWindow) .fixedSize() .background(Color.gray.opacity(0.2)) .onAppear { // 获取当前激活的窗口 currentWindow = NSApplication.shared.windows.first(where: { $0.isKeyWindow }) } } }
注意事项
- 如果窗口带有标题栏,窗口总高度会包含标题栏高度(通常约28pt),此时设置视图frame时需要额外加上标题栏高度,或者使用
.windowStyle(.hiddenTitleBar)隐藏标题栏,让视图尺寸直接对应窗口内容区域尺寸。 - 检查是否有其他父视图设置了强制最小尺寸约束,这类约束会覆盖当前视图的frame设置。
内容的提问来源于stack exchange,提问作者swiftPunk
相关产品推荐
相关产品推荐

