码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【SwiftUI模块】0003、SwiftUI搭建瀑布流-交错网格


    SwiftUI小功能模块系列
    0001、SwiftUI自定义Tabbar动画效果
    0002、SwiftUI自定义3D动画导航抽屉效果
    0003、SwiftUI搭建瀑布流-交错网格-效果

    技术:SwiftUI3.0、瀑布流、交错网格
    运行环境:
    SwiftUI3.0 + Xcode13.4.1 + MacOS12.5 + iPhone Simulator iPhone 13 Pro Max

    SwiftUI搭建瀑布流-交错网格-效果

      • 概述
      • 详细
        • 一、运行效果
        • 二、项目结构图
        • 三、程序实现 - 过程
          • 1.创建一个项目命名为 StaggeredGrid
          • 1.1.引入资源文件
          • 2. 创建一个虚拟文件`New Group` 命名为 `View`
          • 3. 创建一个文件`New File` 选择`SwiftUI View`类型 命名为`Home`
          • 4. 创建一个文件`New File` 选择`SwiftUI View`类型 命名为`StaggeredGrid`
          • 5. 创建一个虚拟文件`New Group` 命名为 `Model`
          • 6. 创建一个文件`New File` 选择`SwiftUI View`类型 命名为`Post` ,并且删除预览视图 改造成一个模型
        • Code
          • ContentView - 主窗口
          • Home - 主页
          • StaggeredGrid.swift - 瀑布流-交错网格布局
          • Post - 模型

    概述

    使用SwiftUI搭建一个做一个瀑布流-交错网格

    详细

    一、运行效果

    请添加图片描述

    二、项目结构图

    在这里插入图片描述

    三、程序实现 - 过程

    思路:
    1.创建主窗口
    2.再搭建瀑布流-交错网格页面
    3.添加模型数据
    4.添加一个测试瀑布流-交错网格的加减按钮

    1.创建一个项目命名为 StaggeredGrid

    在这里插入图片描述

    在这里插入图片描述

    1.1.引入资源文件

    随机找十张图片即可
    在这里插入图片描述

    2. 创建一个虚拟文件New Group 命名为 View

    在这里插入图片描述
    在这里插入图片描述

    3. 创建一个文件New File 选择SwiftUI View类型 命名为Home

    在这里插入图片描述
    在这里插入图片描述在这里插入图片描述

    4. 创建一个文件New File 选择SwiftUI View类型 命名为StaggeredGrid

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    5. 创建一个虚拟文件New Group 命名为 Model

    在这里插入图片描述
    在这里插入图片描述

    6. 创建一个文件New File 选择SwiftUI View类型 命名为Post ,并且删除预览视图 改造成一个模型

    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述

    Code

    ContentView - 主窗口

    主要是展示主窗口Home

    //
    //  ContentView.swift
    //  Shared
    //
    //  Created by 李宇鸿 on 2022/8/13.
    //
    
    import SwiftUI
    
    struct ContentView: View {
        var body: some View {
            Home()
        }
    }
    
    struct ContentView_Previews: PreviewProvider {
        static var previews: some View {
            ContentView()
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    Home - 主页

    思路

    1. 创建导航
    2. 创建瀑布流布局-交错网格
    3. 创建数据
    4. 创建瀑布流展示的View
    //
    //  Home.swift
    //  StaggeredGrid (iOS)
    //
    //  Created by 李宇鸿 on 2022/8/13.
    //
    
    import SwiftUI
    
    struct Home: View {
        @State var posts : [Post] = []
        
        // To show dynamic
        @State var columns : Int = 2
        
        // Smooth Hero Effect
        @Namespace var animation
        
        var body: some View {
            // 创建导航
            NavigationView{
                // 设置中心内容
                StaggeredGrid(columns:columns, list:posts, content: { post in
                    // 在这里创建帖子卡片
                    PostCard(post: post)
                        .matchedGeometryEffect(id: post.id, in: animation)
                        .onAppear{
                            print(post.imageURL)
                        }
                })
                .padding(.horizontal)
                    .navigationTitle("Staggered Grid")
                    .toolbar{
                        ToolbarItem(placement: .navigationBarTrailing) {
                            
                            Button{
                                columns += 1
                            }label: {
                                Image(systemName: "plus")
                            }
                        }
                        ToolbarItem(placement: .navigationBarTrailing) {
                            
                            Button{
                                columns = max(columns - 1,1)
                            }label: {
                                Image(systemName: "minus")
                            }
                        }
                    }
                // 动画……
                    .animation(.easeInOut, value: columns)
                
            }
            // 出现的时候
            .onAppear{
                for index in 1...10 {
                    posts.append(Post(imageURL: "post\(index)"))
                }
            }
        }
    }
    
    struct Home_Previews: PreviewProvider {
        static var previews: some View {
            Home()
        }
    }
    
    // 因为我们声明T为可识别的…
    // 所以我们需要传递可识别集合/数组…
    struct PostCard : View {
        var post : Post
        var body: some View{
            Image(post.imageURL)
                .resizable()
                .aspectRatio(contentMode: .fit)
                .cornerRadius(10)     
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80

    StaggeredGrid.swift - 瀑布流-交错网格布局

    主要是做 瀑布流-交错网格
    思路

    1. 提供外界初始化操作 - 尽量提供额外多个属性 让外界调用 - 比如 : 网格的列数、间距、是否显示滚动条、数据的数量、网格的展示View
    2. 添加演示±的瀑布流-交错网格效果演示
    3. 展示瀑布流-交错网格内容 - 优化瀑布流-交错网格加载
    
    //
    //  StaggeredGrid.swift
    //  StaggeredGrid (iOS)
    //
    //  Created by 李宇鸿 on 2022/8/13.
    //
    
    import SwiftUI
    
    // 自定义视图构建器…… Content 外界传递的视图
    
    // T -> 是用来保存可识别的数据集合… 外界传递的列表模型数据
    
    struct StaggeredGrid<Content: View, T : Identifiable>: View where T: Hashable {
        
        // 它将从集合中返回每个对象来构建视图…
        var content: (T) -> Content
        
        var list : [T]
        
        // 列……
        var columns : Int
        
        // 属性
        var showsIndicators : Bool
        var spacing : CGFloat
        
        
        // 提供构造函数的闭包
        init(columns: Int, showsIndicators: Bool = false,spacing : CGFloat = 10, list:[T], @ViewBuilder content: @escaping(T)->Content){
            self.content = content
            self.list = list
            self.spacing = spacing
            self.showsIndicators = showsIndicators
            self.columns = columns
        }
        
        
        // 交错网格功能…
        func setUpList()->[[T]]{
            
            // 创建列的空子数组计数…
            var gridArray : [[T]] = Array(repeating: [], count: columns)
            
            // 用于Vstack导向视图的拆分数组…
            var currentIndex : Int = 0
            for object in list{
                gridArray[currentIndex].append(object)
                // increasing index count
                // and resetting fi overbounds the columns count...
                //增加索引计数
                //和重置fi越界列计数…
                if currentIndex == (columns - 1){
                    currentIndex = 0
                }
                else{
                    currentIndex += 1
                }
            }
            return gridArray
        }
        
        
        var body: some View {
            
    
            ScrollView(.vertical,showsIndicators: showsIndicators)
            {
                HStack(alignment:.top){
                    ForEach(setUpList(),id:\.self){ columnsData in
                        
                        // 优化使用LazyStack…
                        LazyVStack(spacing:spacing){
                            ForEach(columnsData){ object in
                                content(object)
                        }
                        
                       
                        }
                        
                    }
                }
                //只有垂直填充…
                //水平填充将是用户可选的…
                .padding(.vertical)
            }
            
        }
    }
    
    struct StaggeredGrid_Previews: PreviewProvider {
        static var previews: some View {
    //        StaggeredGrid()
            // 预览的是主窗口页面
            ContentView()
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99

    Post - 模型

    import SwiftUI
    
    struct Post: Identifiable,Hashable {
        var id = UUID().uuidString
        var imageURL: String
        
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
  • 相关阅读:
    tomcat 命令行窗口乱码
    【数据结构——顺序表】线性表很难嘛?这篇文章能让你轻松掌握顺序表
    现代控制理论入门+理解
    AtCoder abc 136
    编写一个函数,要求输入任意两个无符号32位整形数,在控制台打印两个数相加的结果,要求禁止使用64位变量
    MSDC 4.3 接口规范(22)
    计算机毕业设计ssm+vue基本微信小程序的今日菜谱系统
    【Go】excelize库实现excel导入导出封装(一),自定义导出样式、隔行背景色、自适应行高、动态导出指定列、动态更改表头
    HTML+CSS+JavaScript仿京东购物商城网站 web前端制作服装购物商城 html电商购物网站
    [LeetCode周赛复盘] 第 115 场双周赛20231014
  • 原文地址:https://blog.csdn.net/qq_42816425/article/details/126325803
  • 最新文章
  • 【JVM】编译执行与解释执行的区别是什么?JVM 使用哪种方式?
    用 Hashids 优雅解决 C 端自增 ID 暴露问题
    V8引擎 精品漫游指南--Ignition篇(上) 指令 栈帧 槽位 调用约定 内存布局 基础内容
    LLVM Pass快速入门(四):代码插桩
    milkup:桌面端 markdown AI续写和即时渲染
    基于项目工程构建SBOM(软件物料清单)的研究
    鸿蒙应用开发UI基础第二节:鸿蒙应用程序框架核心解析与实操
    .NET 中如何快速实现 List 集合去重?
    扣子Coze实战:从0到1打造抖音+小红书热点监控智能体
    浅谈数据访问层
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号