Я пытаюсь создать View, который поместит Blur () в нижнюю часть макета iPhone, соблюдая безопасные области и который я могу легко использовать повторно.
Что-то вроде этого:
import SwiftUI
struct SafeBottomBlurContainer: View {
@Environment(\.colorScheme) var colorScheme
var body: some View {
GeometryReader { geometry in
VStack {
Spacer()
ZStack {
Blur(style: self.colorScheme == .dark ? .systemThinMaterialDark : .systemThinMaterialLight)
.frame(
width: geometry.size.width,
height: geometry.safeAreaInsets.bottom + 50
)
Holder()
.padding(.bottom, geometry.safeAreaInsets.bottom)
}
}
.edgesIgnoringSafeArea(.bottom)
}
}
}
struct Holder: View {
var body: some View {
Rectangle().opacity(0.5)
.frame(height: 50)
}
}
struct SafeBottomBlurContainer_Previews: PreviewProvider {
static var previews: some View {
SafeBottomBlurContainer()
}
}
Вот, кстати, расширение ~~ blue ~~ blur:
import SwiftUI
struct Blur: UIViewRepresentable {
var style: UIBlurEffect.Style = .systemMaterial
func makeUIView(context: Context) -> UIVisualEffectView {
return UIVisualEffectView(effect: UIBlurEffect(style: style))
}
func updateUIView(_ uiView: UIVisualEffectView, context: Context) {
uiView.effect = UIBlurEffect(style: style)
}
}
Теперь я хотел бы каким-то образом передать Holder()
, чтобы я мог отрегулируйте высоту размытия (здесь + 50). Я чувствую, что должен каким-то образом использовать AnyView, но не могу этого понять. Возможно, я ошибаюсь.
Вот как я хотел бы использовать его в примере ContentView ():
import SwiftUI
struct ContentView: View {
var body: some View {
ZStack {
Color.pink.edgesIgnoringSafeArea(.all)
SafeBottomBlurContainer(containedView: MyCustomViewWithWhateverHeight)
}
}
}