Здесь я пытался представить оповещение (рассмотрим color.black.opacity .. в качестве предупреждения в моем коде ниже) двумя разными способами. < /P>
- Один из них использует ZSTACK в ContentView или даже в MainView. В обоих
случаи AlertView открывается за лишним и не охватывает
cheetView. - Второй способ использует AlertViewModifier в листовом обзоре.
с этим, я все еще в взаимодействии с CAMERSIEVE (вместо MAISE OUTEREVIEW). Itleview.
Код: Выделить всё
import SwiftUI
class SampleViewModel: ObservableObject {
@Published var showSheet = false
@Published var panelDetent = PresentationDetent.medium
@Published var showZStackAlert: Bool = false
}
struct ContentViewA: View {
@StateObject var viewModel: SampleViewModel = .init()
@State private var showSheet: Bool = false
var body: some View {
NavigationStack {
ZStack {
if viewModel.showZStackAlert {
AlertView()
}
MainView()
}
}
.environmentObject(viewModel)
}
}
/// Presenting custom alert from main ContentView
struct AlertView: View {
var body: some View {
VStack {
Color.black.opacity(0.5).edgesIgnoringSafeArea(.all)
}
}
}
struct MainView: View {
@EnvironmentObject var viewModel: SampleViewModel
@State private var showSheet: Bool = false
var body: some View {
ZStack {
// if viewModel.showZStackAlert {
// AlertView()
// }
//
VStack {
Text("This is main view with always one sheet displayed")
}
}
.onAppear {
self.showSheet = true
}
.sheet(isPresented: $showSheet) {
SheetView().environmentObject(viewModel)
}
// More sheets
//.sheet(isPresented: $showSheetA) {
//SheetViewA().environmentObject(viewModel)
//}
}
}
struct SheetView: View {
@EnvironmentObject var viewModel: SampleViewModel
@Environment(\.presentationMode) private var presentationMode
@State private var showAlert: Bool = false
var body: some View {
NavigationStack {
ZStack {
Color.mint.opacity(0.1).edgesIgnoringSafeArea(.all)
VStack {
Button {
viewModel.showZStackAlert = true
// self.showAlert = true
} label: {
Text("Tap me to open alert")
}
}
}
}
.presentationDetents([.medium, .large], selection: $viewModel.panelDetent)
.interactiveDismissDisabled(true)
.presentationBackgroundInteraction(.enabled)
.alertView(isPresented: $showAlert)
}
}
/// Presenting custom alert using Alert View Modifier
struct AlertViewModifier: ViewModifier {
@Binding var isPresented: Bool
init(isPresented: Binding) {
self._isPresented = isPresented
}
func body(content: Content) -> some View {
content
.animation(nil, value: self.$isPresented.wrappedValue)
.overlay(self.$isPresented.wrappedValue ? Color.black.opacity(0.5) : nil)
.overlay(self.$isPresented.wrappedValue ? alertContent() : nil)
.animation(.default, value: self.$isPresented.wrappedValue)
}
@ViewBuilder
private func alertContent() -> some View {
GeometryReader { geometry in
if self.$isPresented.wrappedValue {
VStack {
/// Contents of alert view
}
.fixedSize(horizontal: false, vertical: true)
.position(x: geometry.size.width/2, y: geometry.size.height/2)
.frame(minWidth: 350.0, maxWidth: 350.0)
}
}
}
}
extension View {
func alertView(isPresented: Binding) -> some View {
return modifier(AlertViewModifier(isPresented: isPresented))
}
}
Подробнее здесь: https://stackoverflow.com/questions/795 ... ull-screen