В Swiftui Как автоматически закрыть модальное окно с поворотом в альбомную - PullRequest
1 голос
/ 08 июля 2020

В настоящее время я использую объект окружения ландшафта на основе этого кода - { ссылка }

На мой взгляд, у меня есть модальные окна, которые появляются и исчезают соответствующим образом с помощью @ State / @ Binding в зависимости от " Готово "Нажатие кнопки. Мое приложение показывает другое представление при повороте в альбомную ориентацию, и я хотел бы, чтобы модальное окно автоматически отклонялось при повороте, но не мог понять, как изменить @binding var на основе другого объекта @ ennvironment.

Здесь это упрощенный образец моего модального представления

struct StepsView: View {
    @Binding var isPresented:Bool
    @EnvironmentObject var orientation:Orientation

    var body: some View {
        VStack(alignment: .center) {
              Text("Step")
              }
             .navigationBarItems(trailing: Button(action: {
                    //print("Dismissing steps view...")
                    self.isPresented = false
                }) {
                    Text("Done").bold()
                })
            }

спасибо за любую помощь!

Ответы [ 2 ]

1 голос
/ 08 июля 2020

Оцените ответ @davidev, но я хотел, чтобы каждый модал действовал немного по-другому, поэтому я сделал это так

struct StepsView: View {
    @Binding var isPresented:Bool
    @EnvironmentObject var orientation:Orientation
    
    private var PortraitView:some View {
        VStack(alignment: .center) {
              Text("Modal")
              }
             .navigationBarItems(trailing: Button(action: {
                    self.isPresented = false
                }) {
                    Text("Done").bold()
                })
            }
    
    
    var body: some View {
        buildView(isLandscape: orientation.isLandScape, isShowing: &isPresented)
    }

    func buildView(isLandscape:Bool, isShowing:inout Bool) -> AnyView {

        if !isLandscape {
            return AnyView(PortraitView)
        } else {
            isShowing = false
            return AnyView(EmptyView())
        }
    }
0 голосов
/ 08 июля 2020

Вот возможный подход с расширением класса Device с помощью переменной, которая отслеживает открытое модальное представление.

import Combine

final class Orientation: ObservableObject {
    @Published var isLandscape: Bool = false {
        willSet {
            objectWillChange.send()
            
            if (newValue)
            {
                self.showModal = false
            }
        }
    }
    
    @Published var showModal : Bool = false
}

При изменении ландшафта и ориентации на альбомную, showModal будет установлено в false .

Здесь ContentView ..

struct ContentView6: View {
    
    @EnvironmentObject var orientation:Orientation
    // 1.
    @State private var showModal = false
    
    var body: some View {
      
       Button("Show Modal") {
          // 2.
        self.orientation.isLandscape.toggle()
       // 3.
       }.sheet(isPresented: self.$orientation.isLandscape) {
        ModalView(isPresented: self.$orientation.isLandscape).environmentObject(self.orientation)
        }
    }
}
...