一个实际使用SwiftUI 4.0中ViewThatFits自适应视图的例子

Posted 大熊猫侯佩

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一个实际使用SwiftUI 4.0中ViewThatFits自适应视图的例子相关的知识,希望对你有一定的参考价值。

概述

在App图表显示中,我们需要在图表附近画出图表对应的图例。

我们知道,图例的尺寸是和实际占位宽度相匹配的。

如果实际空间比较小,我们就纵向显示图例,否则我们可以利用更大的空间横向显示图例。

一般来说,如何实现上述功能呢?

之前的解决方案

我们可以使用GeometryReader来确定实际宽度,然后据此来改变每个图例的布局:

struct LegendsView: View 
    // 判断使用横向或是纵向显示布局
    private func layoutByVStack(_ width: CGFloat? = nil) -> Bool 
        var layoutByVStack = false
        if let width = width, width <= 256 
            layoutByVStack = true
        
        return layoutByVStack
    
    
    var body: some View 
        GeometryReader  reader in
            HStack 
                Text("Hives Count:")
                    .frame(width: 100, alignment: .leading)
                   
                if layoutByVStack(reader.size.width)
                    VStack 
                        Rectangle()
                            .fill(Color.blue)
                            .frame(width: 15, height: 7)
                        Text("成功")
                    
                else
                    HStack 
                        Rectangle()
                            .fill(Color.blue)
                            .frame(width: 15, height: 7)
                        Text("成功")
                    
                
                
                if layoutByVStack(reader.size.width)
                    VStack 
                        Rectangle()
                            .fill(Color.orange)
                            .frame(width: 15, height: 7)
                        Text("失败")
                    
                else
                    HStack 
                        Rectangle()
                            .fill(Color.orange)
                            .frame(width: 15, height: 7)
                        Text("失败")
                    
                
                
                if layoutByVStack(reader.size.width)
                    VStack 
                        Rectangle()
                            .fill(Color.gray.opacity(0.5))
                            .frame(width: 15, height: 7)
                        Text("未定义")
                    
                else
                    HStack 
                        Rectangle()
                            .fill(Color.gray.opacity(0.5))
                            .frame(width: 15, height: 7)
                        Text("未定义")
                    
                
                
                Spacer()
            
        
    

但这样做的话,那个阙值 256 需要多次实验才能最终确定。

SwiftUI 4.0中更灵活的ViewThatFits

SwiftUI 4.0为我们带来了新的ViewThatFits自适应视图,使用它我们不但可以二选一,甚至可以根据布局的紧凑程度从多个备选方案中选择一个最适合的布局:

struct LegendsView2: View 
    
    var body: some View 
        HStack 
            Text("Hives Count:")
                .frame(width: 100, alignment: .leading)
               
            ViewThatFits 
                HStack 
                    HStack 
                        Rectangle()
                            .fill(Color.blue)
                            .frame(width: 15, height: 7)
                        Text("成功")
                    
                    
                    HStack 
                        Rectangle()
                            .fill(Color.orange)
                            .frame(width: 15, height: 7)
                        Text("失败")
                    
                    
                    HStack 
                        Rectangle()
                            .fill(Color.gray.opacity(0.5))
                            .frame(width: 15, height: 7)
                        Text("未定义")
                    
                
                
                HStack 
                    VStack 
                        Rectangle()
                            .fill(Color.blue)
                            .frame(width: 15, height: 7)
                        Text("成功")
                    
                    
                    VStack 
                        Rectangle()
                            .fill(Color.orange)
                            .frame(width: 15, height: 7)
                        Text("失败")
                    
                    
                    VStack 
                        Rectangle()
                            .fill(Color.gray.opacity(0.5))
                            .frame(width: 15, height: 7)
                        Text("未定义")
                    
                
                
                VStack 
                    Rectangle()
                        .fill(Color.blue)
                        .frame(width: 15, height: 7)
                    
                    Rectangle()
                        .fill(Color.orange)
                        .frame(width: 15, height: 7)
                    
                    Rectangle()
                        .fill(Color.gray.opacity(0.5))
                        .frame(width: 15, height: 7)
                
            
            
            // 我们还可以用多个ViewThatFits视图,为每个图例实现独立的推荐布局
            /*
            ViewThatFits 
                
                HStack 
                    Rectangle()
                        .fill(Color.blue)
                        .frame(width: 15, height: 7)
                    Text("成功")
                
                
                VStack 
                    Rectangle()
                        .fill(Color.blue)
                        .frame(width: 15, height: 7)
                    Text("成功")
                
            
            
            ViewThatFits 
                
                HStack 
                    Rectangle()
                        .fill(Color.orange)
                        .frame(width: 15, height: 7)
                    Text("失败")
                
                
                VStack 
                    Rectangle()
                        .fill(Color.orange)
                        .frame(width: 15, height: 7)
                    Text("失败")
                
                
                
            
            
            ViewThatFits 
                
                HStack 
                    Rectangle()
                        .fill(Color.gray.opacity(0.5))
                        .frame(width: 15, height: 7)
                    Text("未定义")
                
                
                VStack 
                    Rectangle()
                        .fill(Color.gray.opacity(0.5))
                        .frame(width: 15, height: 7)
                    Text("未定义")
                
                
            
            */
            Spacer()
        
    

这样一来,我们可以完全省去GeometryReader和阙值的“烦心事”,非常方便:

总结

在本篇博文中,我们用一个实际的例子介绍了SwiftUI 4.0中ViewThatFits自适应视图的使用,更多内容可以移步以下链接观赏:

SwiftUI 4.0 (iOS 16) 新ViewThatFits视图使用简介

那么,下次再会啦!😉

以上是关于一个实际使用SwiftUI 4.0中ViewThatFits自适应视图的例子的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI 4.0 (iOS 16) 新ViewThatFits视图使用简介

SwiftUI 4.0 (iOS 16) 新ViewThatFits视图使用简介

SwiftUI 4.0(iOS 16+)使用新的 Gauge 视图极简实现仪表盘外观

SwiftUI 4.0(iOS 16+)使用新的 Gauge 视图极简实现仪表盘外观

iOS 16 中 SwiftUI 4.0 轻松实现导航栏标题可编辑

iOS 16 中 SwiftUI 4.0 轻松实现导航栏标题可编辑