问题描述
您可以看到图片,我想将搜索栏准确地放在safeArea
的顶部,但是proxy.safeAreaInsets
的值不正确,因为在父级PreviewProvider
中使用edgesIgnoringSafeArea
。
我该怎么办?有什么方法可以访问safeAreaInsets?
struct FindView: View {
// MARK: - Properties
@Observedobject var viewmodel: Findviewmodel
init(viewmodel: Findviewmodel){
self.viewmodel = viewmodel
}
var body: some View {
GeometryReader { proxy in
ScrollView(.vertical,showsIndicators: true,content: {
vstack(alignment: .leading,spacing: 8){
SearchBar()
.frame(height: 48,alignment: .center)
.padding(.all,16)
Text("Categories")
.multilineTextAlignment(.leading)
.font(.system(size: 21))
.padding(.all,16)
}.frame(width: proxy.size.width)
})
}
}
}
struct FindView_Previews: PreviewProvider {
static var previews: some View {
ZStack(alignment: .center,content: {
Rectangle().foregroundColor(.red)
FindView(viewmodel: Findviewmodel())
}).edgesIgnoringSafeArea(.all)
}
}
解决方法
简单方法;
struct test: View {
var body: some View {
VStack{
Text("Your view comes here")
Spacer()
}
.frame(minWidth:0,maxWidth: .infinity,minHeight: 0,maxHeight: .infinity,alignment: .center)
.padding(.top,UIApplication.shared.windows.first?.safeAreaInsets.top ?? 40)
.background(Color.red)
.edgesIgnoringSafeArea(.all)
}
}
,
您应该仅将.edgesIgnoringSafeArea(.all)
应用于矩形,而不应用于ZStack。这样,只有它可以填满屏幕,而其他所有东西都保留在原处。
然后,为了使FindView
充满屏幕(注意安全区域),您需要将其框架扩展为.frame(maxWidth: .infinity,maxHeight: .infinity)
代码示例:
struct ContentView: View {
var body: some View {
ZStack {
Rectangle()
.fill(Color.red)
.edgesIgnoringSafeArea(.all)
Text("This should respect the safe area")
.frame(maxWidth: .infinity,alignment: .top)
}
}
}