以下是一个示例代码,展示了如何实现安全区域自动调整大小:
import SwiftUI
struct ContentView: View {
@State private var contentSize: CGSize = .zero
@State private var safeAreaInsets: EdgeInsets = .zero
var body: some View {
VStack {
Text("Content View")
.font(.title)
.padding()
.background(Color.blue)
.foregroundColor(Color.white)
.cornerRadius(10)
.onSizeChange { newSize in
contentSize = newSize
}
}
.padding()
.background(Color.gray)
.onAppear {
let window = UIApplication.shared.windows.first
safeAreaInsets = window?.safeAreaInsets ?? .zero
}
.edgesIgnoringSafeArea(.all)
}
}
extension View {
func onSizeChange(perform action: @escaping (CGSize) -> Void) -> some View {
self.background(
GeometryReader { geometry in
Color.clear
.preference(
key: SizePreferenceKey.self,
value: geometry.size
)
}
.onPreferenceChange(SizePreferenceKey.self, perform: action)
)
}
}
struct SizePreferenceKey: PreferenceKey {
static var defaultValue: CGSize = .zero
static func reduce(value: inout CGSize, nextValue: () -> CGSize) {
value = nextValue()
}
}
上述代码中,我们首先在ContentView
中声明了两个@State
属性:contentSize
和safeAreaInsets
。contentSize
用于追踪内容视图的大小变化,safeAreaInsets
用于获取安全区域的边距。
然后,我们在VStack
中添加了一个文本视图,并使用.onSizeChange
修饰符来捕捉其大小变化。在大小变化时,我们更新了contentSize
属性。
接下来,我们使用.onAppear
修饰符在视图出现时获取窗口的安全区域边距,并将其赋值给safeAreaInsets
属性。
最后,我们使用.edgesIgnoringSafeArea(.all)
修饰符来忽略安全区域的边距,以便内容视图可以延伸到屏幕边缘。
通过上述代码,我们可以实现安全区域自动调整大小,并在需要时获取安全区域的边距。