Представление пользовательского оповещения поверх всех видов, включая листы или полную обложкуIOS

Программируем под IOS
Ответить Пред. темаСлед. тема
Anonymous
 Представление пользовательского оповещения поверх всех видов, включая листы или полную обложку

Сообщение Anonymous »

Я пытаюсь найти рабочее решение для этой проблемы в течение длительного времени, но, похоже, не могу получить никаких решений, поэтому работая в моем случае. Модификатор Swiftui «Alert», кажется, представляется поверх всех представлений, но настройка элементов оповещения настолько ограничена, из -за чего мне приходилось создать пользовательское предупреждение. Мое оповещение содержит значки и кнопки стиля. Приложение представляет MainView, и над ним всегда будет лист, высота которого можно отрегулировать (иногда полная крышка вместо листа). Оповещения могут быть представлены Mainview и любым из просмотров листа. В любом случае, я хочу, чтобы оповещение всегда было на вершине вида листа (или полной обложки) < /p>
Здесь я пытался представить оповещение (рассмотрим 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))
}
}
Как я могу представить AlertView всегда на вершине листа?

Подробнее здесь: https://stackoverflow.com/questions/795 ... ull-screen
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Как захватить весь экран, включая нижние листы и другие наложения в Android Kotlin?
    Anonymous » » в форуме Android
    0 Ответы
    18 Просмотры
    Последнее сообщение Anonymous
  • Представление пользовательского представления поверх любого представления в SwiftUI
    Anonymous » » в форуме IOS
    0 Ответы
    34 Просмотры
    Последнее сообщение Anonymous
  • SwiftUI — отключить представление взаимодействия с просмотром с помощью специального оповещения
    Гость » » в форуме IOS
    0 Ответы
    27 Просмотры
    Последнее сообщение Гость
  • Представление оповещения в SwiftUI с использованием MVVM
    Anonymous » » в форуме IOS
    0 Ответы
    7 Просмотры
    Последнее сообщение Anonymous
  • Получить обложку альбома с помощью FFmpeg
    Гость » » в форуме Android
    0 Ответы
    7 Просмотры
    Последнее сообщение Гость

Вернуться в «IOS»