在 Swiftui 中如何通过旋转到横向自动关闭模态

Posted

技术标签:

【中文标题】在 Swiftui 中如何通过旋转到横向自动关闭模态【英文标题】:In Swiftui How to automatically close modal with rotation to landscape 【发布时间】:2020-07-08 18:30:05 【问题描述】:

我目前使用基于此代码的景观环境对象 - https://***.com/a/58503841/412154

在我看来,我的模态使用@State/@Binding 适当地出现和消失,具体取决于“完成”按钮的按下。我的应用在旋转到横向时确实显示了不同的视图,我希望模式在旋转时自动关闭,但无法弄清楚如何根据另一个 @ennvironmentobject 更改 @binding var

这是我的模态视图的简化示例

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()
                )
            

感谢您的帮助!

【问题讨论】:

【参考方案1】:

感谢@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())
        
    

【讨论】:

【参考方案2】:

这是一种可能的方法,使用一个变量来扩展 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)
        
    

【讨论】:

以上是关于在 Swiftui 中如何通过旋转到横向自动关闭模态的主要内容,如果未能解决你的问题,请参考以下文章

如何从纵向模式自动旋转到横向模式?

带有表单的 SwiftUI 模态表:设备旋转后左/右填充错误

Xcode 自动布局和旋转

旋转到横向时自动调整 UINavigationBar 的大小

横向使用自动布局的 iOS 拉伸视图

iPad 应用程序,HTML5,横向和纵向旋转