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

如何在SwiftUI中获取iOS当前窗口尺寸(或屏幕尺寸)?

在SwiftUI中获取当前窗口尺寸的方案

纯SwiftUI实现(首选)

直接使用GeometryReader,它能获取当前视图所在容器的尺寸,将其设置为占满整个窗口即可得到窗口的实际可用尺寸:

struct ContentView: View {
    var body: some View {
        GeometryReader { geometry in
            // 在这里使用geometry.size获取窗口尺寸
            VStack {
                Text("窗口宽度: \(geometry.size.width)")
                Text("窗口高度: \(geometry.size.height)")
            }
            .frame(maxWidth: .infinity, maxHeight: .infinity)
        }
    }
}

GeometryReader会自动适配多窗口、分屏等场景,返回的是当前视图所在窗口的实际可用空间(已经处理了安全区、状态栏等布局影响)。

补充:基于尺寸类的适配

如果不需要具体数值,只是做布局适配,可以直接使用SwiftUI提供的环境变量:

struct ContentView: View {
    @Environment(\.horizontalSizeClass) private var horizontalSizeClass
    @Environment(\.verticalSizeClass) private var verticalSizeClass
    
    var body: some View {
        if horizontalSizeClass == .compact {
            // 紧凑宽度布局(比如竖屏手机)
            VStack { ... }
        } else {
            // 常规宽度布局(比如横屏或iPad)
            HStack { ... }
        }
    }
}

若需原始窗口尺寸(涉及少量UIKit)

如果必须获取未经过安全区调整的原始窗口尺寸,可以通过封装UIViewRepresentable获取当前窗口场景,但这会涉及少量UIKit代码:

struct WindowSizeReader: ViewModifier {
    @Binding var windowSize: CGSize
    
    func body(content: Content) -> some View {
        content
            .background(
                WindowSizeView(windowSize: $windowSize)
            )
    }
}

struct WindowSizeView: UIViewRepresentable {
    @Binding var windowSize: CGSize
    
    func makeUIView(context: Context) -> UIView {
        let view = UIView()
        DispatchQueue.main.async {
            windowSize = view.window?.windowScene?.screen.bounds.size ?? .zero
        }
        return view
    }
    
    func updateUIView(_ uiView: UIView, context: Context) {}
}

// 使用方式
struct ContentView: View {
    @State private var windowSize = CGSize.zero
    
    var body: some View {
        Text("原始窗口尺寸: \(windowSize.width) x \(windowSize.height)")
            .modifier(WindowSizeReader(windowSize: $windowSize))
    }
}

内容的提问来源于stack exchange,提问作者mrpawnice

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 23:58:21