SwiftUI中LazyVGrid和LazyHGrid的介绍以及GridItem的用法

SwiftUI中,我们可以使用LazyVGridLazyHGrid视图创建一个二维响应列表。如果我们想要一个垂直网格,我们可以使用LazyVGrid视图,如果我们想要一个水平网格,可以使用LazyHGrid视图。这些视图允许我们创建一个网格的项目,以适应不同的方向和屏幕大小。

LazyVGrid和LazyHGrid

struct GridDemo: View {
  private var data  = Array(1...50)
  private var columns: [GridItem] = [
      GridItem(.fixed(50)),
      GridItem(.fixed(50)),
      GridItem(.fixed(50))
  ]

  var body: some View {
    ScrollView{
      LazyVGrid(columns: columns, spacing: 20) {
        ForEach(data, id: \.self) { item in
          Text(String(item))
            .frame(width: 50, height: 50, alignment: .center)
            .background(.blue)
            .cornerRadius(10)
            .foregroundColor(.white)
            .font(.title)
        }
      }
    } 
    .padding()
  }
}

在这里插入图片描述
在上面的例子中,我们使用LazyVGrid创建了一个显示50个Text的网格。首先,用GridItem定义了一些列。在这里,我们通过设置.fixed(50)定义了三个固定宽度为50的列。

然后,我们将网格视图放入滚动视图中,使其可滚动。最后,指定列作为LazyVGrid的参数。这就是我们在SwiftUI中创建网格布局所需要做的一切。

LazyVGrid:竖向滚动,按行从左向右加载每一项,从上往下加载每一行。每行的第一个项组成一列,依次向右为第二列,第三列等。
LazyHGrid:横向滚动,按列从上到下加载每一项,从左向右加载每一列。每列的第一个项组成一行,从上向下依次为第一行,第二行等。

GridItem

GridItem主要是对这种二维的网格布局的行或者列的一种描述。要想配置二维网格布局,我们需要创建一个包含GridItem实例的一个数组。每一个GridItem实例都描述了LazyVGrid中的一列或者LazyHGrid中的一行的sizespacingalignment信息。

初始化GridItem的方法如下:

init(
    _ size: GridItem.Size = .flexible(),
    spacing: CGFloat? = nil,
    alignment: Alignment? = nil
)

GridItem Size

其中GridItem.Size是一个枚举,有三种类型:

/// 这种类型将一个或多个项目放入到单个灵活的空间中,使用提供的边界和间距来
/// 确定适合多少项。这种方法倾向于尽可能多地插入最小大小的项,但让它们增加到最大大小。
case adaptive(minimum: CGFloat, maximum: CGFloat)
/// 这种类型指定了固定的值用于列的宽度或者行的高度。
case fixed(CGFloat)
/// 这种类型的大小是删除间隔和非灵活项后的网格大小,除以固定在提供边界内的灵活项的数量。
case flexible(minimum: CGFloat, maximum: CGFloat)

说起来还是不太好理解。

比如说我们想在LazyVGrid的一行或者LazyHGrid的一列显示尽可能多的item,我们可以用adaptive(),比如设置GridItem(.adaptive(minimum: 50)) ,那么就会以最小50的距离尽可能的排列更多的item。

LazyVGrid
在这里插入图片描述

LazyHGrid
在这里插入图片描述

如果要控制每列或行中的数量,可以使用flexible()。但是,如果没有足够的空间容纳视图的最小尺寸,则每项之间可能会重叠。

LazyVGrid
在这里插入图片描述

LazyHGrid
在这里插入图片描述

如果就像给列或者行设置一个固定的尺寸,可以使用fixed()

LazyVGrid
在这里插入图片描述

LazyHGrid
在这里插入图片描述

GridItem Spacing

Spacing定义了当前项与下一项的间距。如果此值为nil,则该项使用当前平台的合理默认值。

下面是一个五列网格的示例,其中列中每个项目之间的间距分别为0、10、20、30、40。

struct GridDemo: View {
  private var data  = Array(1...50)
  private var columns: [GridItem] = [
    GridItem(.fixed(50), spacing: 0),
    GridItem(.fixed(50), spacing: 10),
    GridItem(.fixed(50), spacing: 20),
    GridItem(.fixed(50), spacing: 30),
    GridItem(.fixed(50), spacing: 40)
  ]

  var body: some View {
    ScrollView() {
      LazyVGrid(columns: columns) {
        ForEach(data, id: \.self) { item in
          Text(String(item))
            .frame(width: 50, height: 50, alignment: .center)
            .background(.blue)
            .cornerRadius(10)
            .foregroundColor(.white)
            .font(.title)
        }
      }
    } 
    .padding()
  }
}

在这里插入图片描述
这里需要注意的是最后一列定义的spacing是40,但是因为这个是最后一列,所以这个40就被忽略了。

在看一下采用LazyHGrid的效果:

struct GridDemo: View {
  private var data  = Array(1...50)
  private var columns: [GridItem] = [
    GridItem(.fixed(50), spacing: 0),
    GridItem(.fixed(50), spacing: 10),
    GridItem(.fixed(50), spacing: 20),
    GridItem(.fixed(50), spacing: 30),
    GridItem(.fixed(50), spacing: 40)
  ]

  var body: some View {
    ScrollView(.horizontal) {
      LazyHGrid(rows: columns) {
        ForEach(data, id: \.self) { item in
          Text(String(item))
            .frame(width: 50, height: 50, alignment: .center)
            .background(.blue)
            .cornerRadius(10)
            .foregroundColor(.white)
            .font(.title)
        }
      }
    } 
    .padding()
  }
}

在这里插入图片描述

GridItem Alignment

放置每个视图时使用的对齐方式。使用此属性将视图的相对位置锚定到视图分配的网格空间中的相对位置。

默认情况下,每个项目将在行/列内居中对齐。我们可以通过alignment属性来改变这个。
在这里插入图片描述

写在最后

文章中主要介绍了LazyVGridLazyHGrid的主要用法,包括布局类型,间距和对齐等属性的设置,希望能够让大家更直观的了解LazyVGridLazyHGrid的使用,下一篇文章我们一起看一下iOS 16新推出的GridGridRow的用法。

最后,希望能够帮助到有需要的朋友,如果您觉得有帮助,还望点个赞,添加个关注,笔者也会不断地努力,写出更多更好用的文章。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/678980.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Aethir: 破局算力瓶颈,构建AI时代去中心化云基础设施

科技的每一次飞跃都在重新塑造世界,而近年来,跨越式的技术革新再次引发了深刻的变革,那就是人工智能(AI)。 人工智能已然超越了此前的所有技术概念,成为了继互联网之后的下一个巨大浪潮。从自动驾驶汽车到…

我有点想用JDK17了

大家好呀,我是summo,JDK版本升级的非常快,现在已经到JDK20了。JDK版本虽多,但应用最广泛的还得是JDK8,正所谓“他发任他发,我用Java8”。 其实我也不太想升级JDK版本,感觉投入高,收…

【YOLO系列】YOLOv10论文超详细解读(翻译 +学习笔记)

前言 研究AI的同学们面对的一个普遍痛点是,刚开始深入研究一项新技术,没等明白透彻,就又迎来了新的更新版本——就像我还在忙着逐行分析2月份发布的YOLOv9代码,5月底清华的大佬们就推出了全新的v10。。。 在繁忙之余&#xff0…

Apple HEVC Stereo Video

1. 前言 为左眼和右眼携带立体视频视图的能力产生了更丰富的用户体验。 立体视频(有时称为“3D 视频”)向用户的左眼呈现一个图像,向用户的右眼呈现另一幅图像(通常是相关的)以产生立体效果,定义为&#x…

【经验】Ubuntu上离线安装VsCode插件浏览Linux kernel源码

1、下载VsCode离线安装包 1.1 下载 下载地址:https://marketplace.visualstudio.com/vscode 本人安装的插件: C/C++ checkpatch Chinese clangd kconfig Makefile Tools Perl Perl Toolbox注意:C/C++插件要安装Linux 64版本 1.2 安装 将离线安装包拷贝到Ubuntu中,执…

10 -力扣高频 SQL 50 题(基础版)

10 - 每台机器的进程平均运行时间 -- sum(if(activity_type end,timestamp ,-timestamp )) -- 如果activity_type为“end”,值为timestamp,为“start” 为-timestamp,所有数相加end-start -- count(distinct process_id),获取同一机器有几个进行id -- r…

C++系列-STL简介

🌈个人主页:羽晨同学 💫个人格言:“成为自己未来的主人~” 什么是STL STL是C标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。 STL的版本 原始版本 Alexander Stepa…

QT中将资源文件(image、qss、qm等)封装到静态库中,程序该如何引用静态库中的资源文件

1、静态库 2、主程序中使用第三方库中的资源文件 核心代码: int main(int argc, char *argv[]) {QApplication a(argc, argv

C++数组实现推箱子游戏

前言 我是三天打鱼两天晒网的闲人,今天跟着课程视频学习c的数组的运用. 准备好游戏用到的图片资源 代码逻辑实现 #include<iostream> #include<graphics.h> #include<string> #include<conio.h>using namespace std;//设置画布大小 #define SCREEN…

【SpringCloud学习笔记】Elasticsearch

1. Elasticsearch 1.1 安装ES 启动Docker&#xff1a;service docker restart / systemctl restart docker基于Docker创建网络docker network create hm-net向云服务器上传elasticsearch以及kibana的tar包&#xff0c;并使用docker load -i xxx.tar进行加载使用如下命令启动e…

使用Qt实现文本文件的读写操作

文章目录 文本读写简介QFileDialog简介常用方法示例代码 QFile简介常用方法示例代码 QTextStream简介常用方法示例代码 结合使用示例完整示例代码(读写操作&#xff0c;可直接复制运行我使用的Qt版本为QT5.14)mainwindow.hmainwindow.cppmain.cpp代码解释 文本读写简介 在现代…

k8s Pods漂移时间配置

默认为300秒 apiVersion: apps/v1 kind: Deployment metadata:name: my-test spec:replicas: 1selector:matchLabels:app: my-apptemplate:metadata:labels:app: my-appspec:containers:- name: my-containerimage: nginx:latestports:- containerPort: 80tolerations:- key: &…

MySQL之查询性能优化(四)

查询性能优化 MySQL客户端/服务器通信协议 一般来说&#xff0c;不需要去理解MySQL通信协议的内部实现细节&#xff0c;只需要大致理解通信协议是如何工作的。MySQL客户端和服务器之间的通信协议是"半双工"的&#xff0c;这意味着&#xff0c;在任何一个时刻&#…

History 模式和 Hash 模式路由的区别、优缺点及在开发生产环境中的注意事项

在现代单页应用&#xff08;SPA&#xff09;开发中&#xff0c;前端路由是至关重要的一部分。常见的路由模式有两种&#xff1a;History 模式和 Hash 模式。本文将详细探讨这两种模式的区别、优缺点&#xff0c;并在开发和生产环境中的注意事项。 路由模式简介 Hash 模式 H…

.Net 基于.Net8开发的一个Asp.Net Core Webapi后端框架

1.项目结构 该项目是基于.net8开发的Asp.Net Core WebApi后端服务,集成了Efcore,Autofac,Jwt,AutoMapper,Serilog,Quartz,MiniExcel等组件。该框架简单易上手&#xff0c;没有额外的学习成本; 该项目采用了多层结构设计&#xff0c;有利于解耦&#xff0c;包含公共层&#xff0…

机器视觉——硬件常用基础知识

光源 机器视觉中光源的作用 1&#xff09;强化特征&#xff0c;弱化背景 2&#xff09;光源打得好&#xff0c;图好了&#xff0c;后期算法更简化 3&#xff09;图好了&#xff0c;测试速度更高 各种光源的综合性能对比及为啥使用LED灯 光的颜色的选择 白色光&#xff1a;通常用…

【分享】两种方法禁止修改Word文档

对于比较重要的Word文件&#xff0c;不想被随意编辑修改&#xff0c;可以试试以下两个方法&#xff0c;不清楚的小伙伴&#xff0c;一起来看看吧&#xff01; 方法1&#xff1a;设置“只读方式” 我们可以给Word文档设置以“只读方式”打开&#xff0c;这样就算编辑修改了文档…

企业内部聊天软件Riot部署

ubuntu docker 简介 Riot(原Vector)是使用Matrix React SDK构建的Matrix网络聊天客户端,开源免费,功能丰富,支持私人对话,团队对话,语言视频对话,上传文件,社区互动。支持在聊天界面添加各种有趣的插件,比如RSS等各种机器人、虚拟币实时监控等。并且所有通过Riot传…

63. UE5 RPG 兼容没有武器的普通攻击

前面&#xff0c;我们实现了近战攻击技能&#xff0c;敌人通过AI靠近玩家&#xff0c;并且通过AI还能够触发近战攻击的释放。现在我们思考一个问题&#xff0c;如果敌人没有武器&#xff0c;攻击的手段是用的双手&#xff0c;我们该如何去获取它的攻击范围。 现在实现的一套是获…

什么情况!伯克希尔哈撒韦股票跌近100%

KlipC报道&#xff1a;当地时间6月3日开盘后&#xff0c;纽约证劵交易所的一个技术问题导致沃伦巴菲特(Warren Buffett)旗下伯克希尔哈撒韦公司(Berkshire Hathaway)A类股票似乎下跌了近100%&#xff0c;达到185.1美元/股。目前&#xff0c;所有受影响的股票已经恢复交易。 除了…