SwiftUI 如何在横向和纵向中重新排序

Posted

技术标签:

【中文标题】SwiftUI 如何在横向和纵向中重新排序【英文标题】:SwiftUI how to Reorder in Landscape and Portrait 【发布时间】:2019-12-16 01:43:19 【问题描述】:

我们使用自定义 gridView 在网格中显示所有产品。 问题是……如果设备是横向或纵向,我们需要重新排序。

我们该怎么做?

ModularGridStyle(columns: 2, rows: 3)

如果设备是横向的,列和行需要不同。

这里是视图

var body: some View 
Grid(self.products)  product in
                    Text("\(product.name)")

                
                .gridStyle(
                    ModularGridStyle(columns: 2, rows: 3)
                )

【问题讨论】:

这能回答你的问题吗? SwiftUI Repaint View Components on Device Rotation 【参考方案1】:

我会使用verticalSizeClass

@Environment(\.verticalSizeClass) private var verticalSizeClass: UserInterfaceSizeClass?

var body: some View 
    Grid(self.products)  Text(verbatim: "\($0.name)") 
        .gridStyle(
            ModularGridStyle(
                columns: self.verticalSizeClass == .compact ? 3 : 2, 
                rows: self.verticalSizeClass == .compact ? 2 : 3
            )
        )
    

【讨论】:

【参考方案2】:

我个人更喜欢使用 GeometryReader 为纵向/横向设置不同的视图。当然,这有点多余,但通常你还有其他属性也会发生变化:

var body: some View 
    GeometryReader()  g in
        if g.size.width < g.size.height 
            // view in portrait mode
            Grid(self.products)  product in
                Text("\(product.name)")
            
            .gridStyle(
                ModularGridStyle(columns: 2, rows: 3)
            )
         else 
            // view in landscape mode
            Grid(self.products)  product in
                Text("\(product.name)")
            
            .gridStyle(
                ModularGridStyle(columns: 3, rows: 2)
            )
        
    

【讨论】:

【参考方案3】:

这是可能的方法:

private var deviceOrientationPublisher = NotificationCenter.default.publisher(for:
    UIDevice.orientationDidChangeNotification)

@State var dimention: (Int, Int) = (2, 3)
var body: some View 
    Grid(self.products)  product in
        Text("\(product.name)")

    
    .gridStyle(
        ModularGridStyle(columns: dimention.0, rows: dimention.1)
    )
    .onReceive(deviceOrientationPublisher)  _ in
        self.dimention = UIDevice.current.orientation.isLandscape ? (3, 2) : (2, 3)
    

【讨论】:

以上是关于SwiftUI 如何在横向和纵向中重新排序的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI:如何找到图像的高度并使用它来设置框架的大小

使用 SwiftUI 将设备旋转到横向时出现导航栏

如何在不调用该 Activity 的 API 调用的情况下为横向和纵向模式使用不同的设计?

SwiftUI - 丑陋的动画从纵向切换到横向

如何同时支持纵向和横向模式 - XIB 的可重用视图

React Dnd 实现横向和纵向拖拽排序