首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

深入了解 SwiftUI 5 ScrollView 的新功能

SwiftUI 5.0 ,苹果大幅强化了 ScrollView 功能。新增了大量新颖、完善的 API。本文将对这些新功能进行介绍,希望能够让它们更多、更早的帮助到有需要的开发者。...可采用 优化 SwiftUI List 显示大数据集的响应效率[5] 一文中介绍的方式来解决。 scrollPostion(id:) 使用此修饰符可以让滚动视图滚动到特定的位置。...(视图标识) 不支持锚点设定,固定锚点为子视图的 center 正如 优化 SwiftUI List 显示大数据集的响应效率[6] 一文所提到的,当数据集很大时,也会出现性能问题。...总结 我完全没有想到, SwiftUI 5 ,苹果对 ScrollView 进行了全面增强。值得赞赏的是,他们不仅提供了一些一直期待的功能,而且 API 的设计和实现完成度上都非常出色。...就我个人而言, SwiftUI 5 ,ScrollView 的原生方案已经能够满足大多数需求,因此我们将看到更多人采用 ScrollView + LazyStack 的组合方式。

67120

如何判断 ScrollView、List 是否正在滚动

本文将介绍几种 SwiftUI 获取当前滚动状态的方法,每种方法都有各自的优势和局限性。...isScrolling_2022-09-12_10.26.06.2022-09-12 10_28_09方法一:Introspect可在 此处[4] 获取本节的代码 UIKit( AppKit ),开发者可以通过...目前 SwiftUI 在内部的实现上去 UIKit( AppKit )化很明显,比如,本节介绍的方法 SwiftUI 4.0 已经失效方法二:Runloop我第一次接触 Runloop 是在学习 Combine...模式,因此无法有效地区分滚动是由那个控件造成的方法三:PreferenceKey SwiftUI ,子视图可以通过 preference 视图修饰器向其祖先视图传递信息( PreferenceKey...判断的准确度没有前两种方式当可滚动组件的内容出现了非滚动引起的尺寸或位置的变化( 例如 List 某个视图的尺寸发生了动态变化 ),本方式会误判断为发生了滚动,但在视图的变化结束后,状态会马上恢复到滚动结束滚动开始后

3.7K40
您找到你想要的搜索结果了吗?
是的
没有找到

SwiftUI 布局协议 - Part 1

简介 今年 SwiftUI 新增最好的功能之一必须是布局协议。它不但让我们参与到布局过程,而且也给了我们一个很好的机会去更好的理解布局 SwiftUI 的作用。...这是可以的,尽管我仍然推荐你浏览第一部分,至少浅读一下。这将确保我们开始探索第二部分描述的更多高级特性时,我们同一进度。...请注意至少到现在,布局协议不能创建懒加载容器,比如 LazyHStack 或 LazyVStack。懒加载容器是指那些只滚入屏幕时渲染,滚出到屏幕外就停止渲染的视图。...但是不用担心,目前为止你可以认为它们就是视图并且像视图一样使用它们。这个框架使用了漂亮的 Swift 语言技巧使你的布局代码SwiftUI 插入时产生一个透明视图 。...这些信息都可以大大的简化任务。即使你不能有这种奢望来做这种假设,它也可能是开始编码的好地方,让你的布局一些情况下工作,然后开始为更复杂的情况添加代码。

3.2K10

SwiftUI 实现视图居中的若干种方法

SwiftUI ,有很多手段可以达成此目的。本文将介绍其中的一些方法,并对每种方法背后的实现原理、适用场景以及注意事项做以说明。...当然,你也可以利用 Spacer 这个特性,控制 Text HStack 可使用的宽度。...HStack、VStack 进行布局时,会为每个子视图提供四种不同的建议模式( 最小、最大、明确尺寸以及未指定 ),如果子视图不同的模式下返回的需求尺寸是不一样的,意味着该视图是可变尺寸视图。...因此第一个例子,即使没有为 HStack 设置 spacing ,Text 仍然会使用全部的 HStack 宽度。...().fill(.clear)使用 SwiftUI 进行开发的过程,Color、Rectangle 等经常被用来实现对容器的等分操作。

6.6K40

面向所有人的 UI 编程 :透过点按弹窗初尝 SwiftUI

本文是 SwiftUI 开发教程的一篇,我们将一起探究上述问题的答案。若你有兴趣学习 iOS 应用程序开发,又或者是想了解 iOS 程序是如何运行的,欢迎关注这一系列文章。...SwiftUI 集众家之长,具有诸多优秀特性,可以预见它将会出现在诸多应用程序。若你有兴趣,我会在其它文章详解 SwiftUI,本文只着重讲其中弹窗的写法与逻辑。 你会怎样描述一个程序?...SwiftUI 由两类代码组成,分别是 View 和 Modifier。如下图所示,这两类代码都可以 Xcode 中直接拖出来用,你要做的只是玩拼图把它们拼在一起拼出你想要的功能。...纵向排列的 View SwiftUI 里叫做 VStack,它用一个花括号 {包住里面的内容};文字的 View SwiftUI 里叫做 Text。...若你因为文中的长代码感到害怕,觉得程序员都是天才,脑子超好用能将这些代码一次性写出来,不是这样的。比如上面代码的例子,一开始你只有一个简单的思路,我要一句名言,能点按复制就行。

2.1K40

为什么SwiftUI的视图使用结构体?

我之所以说性能因素,是因为很多人认为这是SwiftUI使用结构体的主要原因,实际上这只是更大范围的一部分。...UIKit,每个视图都来自一个名为UIView的类,该类具有许多属性和方法:背景色,确定其放置方式的约束,用于将其内容呈现到其中的图层等等。...struct or class 通常这不是问题,但是有一个名为UIStackView的特定子类,它类似于SwiftUI的VStack和HStack。...SwiftUI,我们所有的视图都是简单的结构体,几乎可以自由创建。想想看:如果您制作一个仅包含一个整数的结构体,结构体的整个大小就是:一个整数。没有其他的。...通过生成不会随时间变化的视图,SwiftUI鼓励我们转向更具功能性的设计方法:将数据转换为UI时,我们的视图变成简单的,惰性的东西,不是会失去控制的智能化的东西。

3.1K10

SwiftUI 布局 —— 对齐

欢迎大家 Discord 频道[2] 中进行更多地交流 “对齐”是 SwiftUI 中极为重要的概念,然而相当多的开发者并不能很好地驾驭这个布局利器。...,还可以标识线 SwiftUI ,分别用 HorizontalAlignment 和 VerticalAlignment 来标识视图纵轴和横轴方向的参考线,并且可以由两者共同构成对视图中的某个具体的参考点的标识...alignmentGuide 修饰器 SwiftUI ,开发者可以使用 alignmentGuide 修饰器来修改视图某个对齐指南的值( 为对齐指南设定显式值,有关显式值见下文)。...文字基线不同于 bottom Text("山不在,有仙名。水不在深,有龙灵。斯是陋室,惟吾德馨。苔痕上阶绿,草色入帘青。谈笑有鸿儒,往来无白丁。可以调素琴,阅金经。无丝竹之乱耳,无案牍之劳形。...overlay、background SwiftUI ,除了我们熟悉的 VStack、HStack、ZStack 、Grid 、List 外,很多 modifier 的功能也都是通过布局来实现的。

6.3K20

使用 SwiftUI 创建一个灵活的选择器

前言 最近,我正在开发一个 Dribbble 上找到的设计的 SwiftUI 实现时,我想到了一个点子,可以通过一些酷炫的筛选器扩展该项目以缩小结果列表。...(不能适应上一行的元素),并通过减去当前项的宽度来更新 HStack 的行宽。...这就是为什么我将分隔行的结果映射到元组,其中包含每行和 UUID 值。 由于如此,我可以向 ForEach 循环提供 id 参数。...这就是为什么我首先将整个 ForEach 循环包装在 HStack ,然后再包装在 Group ,以确保编译器可以正确解释一切。...最后,提供了一个简单的视图实现,可以 SwiftUI 中使用该选择器。这个选择器可用于创建各种交互式选择界面。 - EOF -

24420

为什么 SwiftUI 的视图使用结构体

我之所以说性能因素,是因为很多人认为这是 SwiftUI 使用结构体的主要原因,实际上这只是更大范围的一部分。...struct or class 通常这不是问题,但是有一个名为 UIStackView 的特定子类,它类似于 SwiftUI 的 VStack 和 HStack。... UIKit ,UIStackView 是一种非渲染视图类型,旨在简化布局,但这意味着即使它因为继承的原因具有背景色,也从未真正使用过。... SwiftUI ,我们所有的视图都是简单的结构体,几乎可以自由创建。想想看:如果您制作一个仅包含一个整数的结构体,结构体的整个大小就是:一个整数。没有其他的。...通过生成不会随时间变化的视图,SwiftUI 鼓励我们转向更具功能性的设计方法:将数据转换为 UI 时,我们的视图变成简单的,惰性的东西,不是会失去控制的智能化的东西。

2.4K50

使用 SwiftUI 的 Eager Grids

介绍 早在 2020 年,我们就拥有了 SwiftUI(LazyVGrid 和 LazyHGrid)绘制网格的新视图控件。两年后,我们又获得了另一种在网格(Grid)显示视图的视图控件。...尽管这里的大多数示例都可以,但每一行可以包含任意数量的单元格。 探索网格选项 以下部分,我们将探讨不同的网格大小、对齐和跨越选项。...请注意,虽然我设计应用程序时主要考虑了 macOS,但该应用程序 iPad 上也能流畅运行。无需更改。 当您阅读以下部分时,最好运行 Grid Trainer 应用程序并测试您对网格的理解。...在下面的示例,橙色列的宽度由第二行中最宽的单元格决定。身高也是如此。示例,第二行与行中最高的紫色单元格一样。 未定义大小的单元 默认情况下,网格将为单元格提供尽可能多的空间。...如果您查看第一行的第二个单元格,它应该跨越到以下列。但是第二行的以下列应该扩展到第三列。那是什么?我们可以满足一个条件或另一个条件,但不能同时满足这两个条件。

4.3K20

SwiftUI 布局协议 - Part2

为什么我们不让半径也可以动画呢?...避免布局循环和崩溃 众所周知我们布局期间不能更新视图状态。这会导致不可预测的结果,很可能会使 CPU 达到峰值。在此之前我们看到过这种情况,即闭包在布局期间运行时,也许当时不是太明显。...这是个老问题,我 SwiftUI 刚发布的时候就写过此类问题, Safely Updating The View State [1] 一文可以查看更多信息。 我还想再提一下潜在的崩溃。...这是可以实现的,因为缓存是一个 inout 参数,我们可以 placeSubviews 更新。...我经常认为这些视图是理所当然的,并将它们视为简单不复杂的容器,好吧,尝试编写自己的版本,各种情况下复制一个 HStack ,多种类型的视图和布局优先级竞争同一个空间。。。这是一个不错的挑战!

2.7K30

如何在 Swift 取消一个后台任务

该代码建立在在 Swift 中使用 async let 并行的运行后台任务编写的AsyncLetApp之上。...为什么要取消一个后台任务 与视图的交互可能会触发后台任务的运行,进一步的交互可能会使最初的请求过时,并触发后续的后台任务运行。除了浪费资源外,不取消初始任务可能会导致你的应用程序出现偶现和意外行为。...一个取消按钮被添加到视图中,其点击事件是ViewModel调用取消方法。...使用取消标志 有多种方法可以取消后台任务的工作。...的子任务 SwiftUI 取消和恢复后台任务 结论 异步编程,重要的是停止任何不需要的后台任务以节省资源并避免后台任务干扰应用程序的任何不良副作用。

2.7K30

优化 SwiftUI List 显示大数据集的响应效率

标识( Identity )是 SwiftUI 程序的多次更新识别相同或不同元素的手段,是 SwiftUI 理解你 app 的关键。... SwiftUI 应用代码,绝大多数的视图标识都是通过结构性标识 (有关结构性标识的内容可以参阅 ViewBuilder 研究(下) —— 从模仿中学习[4])来实现的 —— 通过视图层次结构(视图树... SwiftUI 为视图设置显式标识目前有两种方式: ForEach 的构造方法中指定 由于 ForEach 的视图数量是动态的且是在运行时生成的,因此需要在 ForEach 的构造方法中指定可用来标识子视图的...新的问题 细心的朋友应该可以注意到,运行解决方案一的代码后,第一次点击 bottom 按钮时,大概率会出现延迟情况(并不会立即开始滚动)。...scrollByUITableView_2022-04-23_19.44.26.2022-04-23 19_46_20 希望 SwiftUI 之后的版本能够改善上面的性能问题,这样就可以无需使用非原生方法也能达成好的效果

9.1K20

SwiftUI 布局 —— 尺寸( 上 )

SwiftUI 的尺寸 如上文中所示, SwiftUI 的布局过程不同的阶段、出于不同的用途,尺寸这一概念是不断地变化的。...该自定义布局容器又会在它的 sizeThatFits 方法通过调用其子视图代理( Subviews,子视图 Layout 协议的表现方式 )的 sizeThatFits 方法为子视图代理提供建议尺寸...return cache.cropBounds.size } 根据建议尺寸内容的不同,我们可以将建议尺寸细分为四种建议模式, SwiftUI ,父视图会根据它的需求选择合适的建议模式提供给子视图...例如:ZStack 会将其父视图提供给它的建议模式直接转发给 ZStack 的子视图, VStack、HStack 则会要求子视图返回全部模式下的需求尺寸,以判断子视图是否为动态视图( 特定维度可以动态调整尺寸... SwiftUI ,通过设置或调整建议模式进行二次布局的场景很多,比较常用的有:frame、fixedSize 等。

4.6K20

TCA - SwiftUI 的救星?(一)

自那时过了两年后, SwiftUI 的发布才让这套机制有了更加合适的舞台。 SwiftUI 发布初期,我也写过一本相关的书籍[3],里面使用了一些类似的想法,但是很不完善。...可以说,从 iOS 14 开始,SwiftUI 才算逐渐进入了可用的状态。最近随着公司的项目彻底抛弃 iOS 13,我也终于可以更多地正式在工作中用上 SwiftUI 了。...我们类比一下这些步骤 SwiftUI 的实现,可以发现步骤 4 其实已经包含在 SwiftUI 中了:当 @State 或 @ObservedObject 的 @Published 发生变化时,SwiftUI... SwiftUI ,body 的刷新是 SwiftUI 运行时通过 @ObservedObject 属性包装所提供的特性。现在这部分内容被包含在了 WithViewStore 。...虽然这需要我们自己去将 View 和 Model 绑定起来,会有些麻烦,但是如果你想要尽快尝试 TCA,却又不能使用 SwiftUI,也可以 UIKit 中进行学习。

3.2K30

SwiftUI的水平条形图

Numbers 等应用程序,水平条形图被定义为独立的图表类型,不是垂直条形图。除了条形差异外,x轴和y轴的格式也需要不同。...Bar Chart with multiple data sets in SwiftUI SwiftUI 的水平条形图 将条形图转换为水平 水平条形图不仅仅是垂直条形图上的配置,有一些元素是可以重复使用的...,不是水平的堆栈。...水平条形图中,显示条形图上的数值并隐藏X轴可以使图表更简洁。 显示和隐藏水平条形图上的元素 结论 创建水平条形图的SwiftUI代码与创建垂直条形图的代码不同。...创建垂直条形图时学到的技术可以重复使用,但最好将水平条形图视为与垂直条形图不同的图表。当我们深入到轴等组件时,可以看到两个图表的轴线都是一样的,但是它们的标签和定位在x和y之间是换位的。

4.7K20

掌握 ViewThatFits

SwiftUI ,我们可以通过 fixedSize 来强制一个视图以理想尺寸进行呈现: struct IdealSizeDemo: View { var body: some View {...SwiftUI 提供了两个版本的 fixedSize ,我们当前使用的版本要求视图水平和垂直两个轴向上都使用理想尺寸,另一个版本允许我们对单个轴向进行限定。... SwiftUI ,我们可以通过 frame 来修改视图在理想状态下的呈现。...示例 所有的理论知识都是为实际应用服务的。本节,我们将通过几个示例来展示 ViewThatFits 的功能。...总结 正如我们所看到的,ViewThatFits 是 SwiftUI 工具箱的一个强大灵活的组件,它可以帮助开发者优雅地解决多种布局挑战,提升应用程序的用户体验和界面适应性。

15710

使用HSB不是RGB来定义颜色

有多种方法可以代码定义颜色。最常用的方法是指定三种基色的值 - 红色、绿色和蓝色 (RGB)。本文通过指定色调、饱和度和亮度 (HSB) 的值来探索替代机制的使用。...可以 SwiftUI 创建一个调色板以显示可能的颜色。...色轮 HSB 颜色模型,色调表示基色,可以通过围绕色环的角度(以度为单位)来指定,其中红色位于顶部,颜色沿顺时针方向跟随彩虹的颜色。...SwiftUI 使用 0 到 1 之间的值来表示从 0 到 360 度的色调值。以下代码类似于在在 SwiftUI 创建一个环形 Slider的环形Slider用于显示色调选项。...SwiftUI 查看匹配的颜色 色轮显示每种色调的匹配颜色 总结 我发现使用 HSB 定义颜色是一种更直观的颜色定义方式。

2.6K30
领券