首页 > 解决方案 > SwiftUI 导航视图 - 在多个视图中处理大小类

问题描述

如果设备处于纵向/横向模式,我打算使用会有所不同的菜单('MenuView')。我正在使用尺寸类来确定设备类型,这成功地重绘了旋转视图。菜单使用导航视图/链接将您带到进一步的视图(“详细视图”);此视图对于纵向和横向也有不同的视图。我再次使用尺寸类根据旋转成功重绘视图。

但是,我发现当我在DetailedView 中并旋转设备时,显示会直接跳回MenuView,因为它当然已经识别出尺寸等级的变化并调整了该视图。我希望显示保持在此视图中。

当我旋转显示“DetailedView”的设备时,如何防止应用程序跳转到“MenuView”?下面的 MenuView 中的代码:

注意:我StackNavigationViewStyle在这种情况下使用的是。

任何帮助将不胜感激,在此先感谢!

struct MenuView: View {
    
    @Environment(\.horizontalSizeClass) var horizontalSizeClass: UserInterfaceSizeClass?
    @Environment(\.verticalSizeClass) var verticalSizeClass: UserInterfaceSizeClass?
    
    var body: some View {
        
        NavigationView {
            
            Color("MainBg")
                .edgesIgnoringSafeArea(.all)
            
            if horizontalSizeClass == .compact {
                PortraitMenuView()
            } else {
                LandscapeMenuView()
            }
            
        }.navigationViewStyle(StackNavigationViewStyle())
    }
}

更新:DetailedView - 这是从 PortraitMenuView 和 LandscapeMenuView 调用的。PortraitMenuView 中包含的代码 - LandscapeMenuView 中包含相同的导航链接

struct DetailedView: View {
    
    @Environment(\.horizontalSizeClass) var sizeHClass
    @Environment(\.verticalSizeClass) var sizeVClass
    
    var formulae: Functions
    
    var body: some View {
        
        ZStack {
            Color.offWhite
                .edgesIgnoringSafeArea(.all)
            
            VStack {
                
                Group {
                    
                    if sizeHClass == .compact && sizeVClass == .compact {
                        DetailedViewLandscape()
                        
                    } else {
                        DetailedViewPortrait()
                        
                    }
                } 
            }       
        }  
    }
}
struct PortraitMenuView: View {
    
    var body: some View {
    
    VStack {
        ZStack {

            Circle()
            .fill(Color("kMainBg"))
            .frame(width: 300, height: 300)
            .overlay(
                    Text("FORMULA FINDER")
                        .font(.largeTitle).bold()
                        .multilineTextAlignment(.center)
                        .minimumScaleFactor(0.005)
                        .lineLimit(2)
                    .frame(width: 210, height: 210)
            )
        }
        
        Spacer()
           
        NavigationLink(destination: DetailedView()) {
            
            TileView(title: "Formulae", subtitle: "Functions and formulas", boxColor: Color.pastelGreen)
            
            
        }.offset(x: 40)
        
    }.padding(.bottom, 20)
      
    }
    
}

标签: swiftuiswiftui-navigationlink

解决方案


推荐阅读