如何在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
相关产品推荐
相关产品推荐

