【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.创建主窗口
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()
    }
}

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

Post - 模型
import SwiftUI

struct Post: Identifiable,Hashable {
    var id = UUID().uuidString
    var imageURL: String
    
}

demo源码

如需看源码,请点击下载!

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
SwiftUI瀑布流是一种在iOS应用程序中实现多列不规则布局的技术。它可以让开发者创建出独特而有吸引力的界面,以展示图片、卡片或其他内容。瀑布流布局的特点是每个项目的大小和位置都是根据内容自动调整的,形成一个自适应的网格瀑布流通常用于展示图片墙、商品列表和社交媒体的动态内容等场景。 在SwiftUI中实现瀑布流布局可以通过使用`LazyVGrid`或`LazyHGrid`结合`GridItem`实现。`GridItem`定义了每个项目的大小和位置,可以设置不同的列数和行数,以及项目之间的间距。通过适当调整`GridItem`的参数,可以实现不同样式的瀑布流。 为了实现更复杂的瀑布流效果,开发者可以结合自定义动画和过渡效果。通过使用SwiftUI的动画和过渡功能,可以为瀑布流中的项目添加平滑的出现和消失效果,增强用户体验。 引用提供了一些关于SwiftUI中实现瀑布流的小功能模块的示例代码,可以作为参考。引用提供了相关的技术和运行环境信息。另外,引用提供了一个开源项目的链接,该项目实现了一个滚动横幅效果,可能对实现瀑布流布局有所帮助。 总之,SwiftUI瀑布流是一种灵活、自适应的布局技术,可以让开发者以创造性的方式展示内容,并通过自定义动画和过渡效果增强用户体验。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [【SwiftUI模块0003SwiftUI搭建瀑布流-交错网格](https://blog.csdn.net/qq_42816425/article/details/126325803)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [Swift 自定义布局实现瀑布流视图](https://blog.csdn.net/shenjie12345678/article/details/114574210)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宇夜iOS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值