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

GeometryReader :好东西还是坏东西?

( Required Size )返回给父视图 视图建议尺寸作为自身建议尺寸传递给视图 视图原点(0,0)置于 GeometryReader 原点位置 其理想尺寸( Ideal Size...GeometryReader 完全无视视图提出需求尺寸,在这一点上,它处理方式与 overlay 和 background 对待视图方式一致。...在非滚动方向上,ScrollView 会向视图提供该维度上全部可用尺寸。而在滚动方向上,它向视图提供建议尺寸为 nil。...为此,我们首先需要理解 SwiftUI 布局原理。 SwiftUI 布局是一个协商过程。父视图视图提供建议尺寸,视图返回需求尺寸。...父视图是否根据视图需求尺寸来放置视图,以及视图是否根据父视图给出建议尺寸来返回需求尺寸,完全取决于父视图视图预设规则。

48470

深入了解 SwiftUI 5 中 ScrollView 新功能

不限于 ScrollView,支持所有可滚动容器(包括 List、TextEditor 等)。 将可滚动容器内所有视图视为一个整体,并为其添加 margin。...(视图标识) 不支持锚点设定,固定锚点为视图 center 正如 优化在 SwiftUI List 中显示大数据集响应效率[6] 一文所提到,当数据集很大时,也会出现性能问题。...scrollTargetBehavior scrollTargetBehavior 用于设置 ScrollView 滚动行为:分页还是与视图对齐。...当视图滑入和滑出包含它滚动视图可视区域时,scrollTransition 会对该视图应用给定过渡动画,并在不同阶段之间平滑地过渡。...就我个人而言,在 SwiftUI 5 中,ScrollView 原生方案已经能够满足大多数需求,因此我们看到更多人采用 ScrollView + LazyStack 组合方式。

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

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

本文介绍几种在 SwiftUI 中获取当前滚动状态方法,每种方法都有各自优势和局限性。...模式,因此无法有效地区分滚动是由那个控件造成方法三:PreferenceKey在 SwiftUI 中,视图可以通过 preference 视图修饰器向其祖先视图传递信息( PreferenceKey...preference 与 onChange 调用时机非常类似,只有在值发生改变后才会传递数据。在 ScrollView、List 发生滚动时,它们内部视图位置也发生改变。...、List 视图之上,用于在位置发生变化时发送信息func scrollSensor() -> some View { overlay( GeometryReader { proxy...ScrollView + VStack( HStack )这类组合,只需为可滚动视图添加一个 scrollSensor 即可。

3.7K40

SwiftUI 方式进行布局

本文通过用多种手段完成同一需求方式,展示 SwiftUI 布局系统强大与灵活,并通过这些示例让开发者对 SwiftUI 布局逻辑有更多认识和理解。...无论为同一个视图添加多少层 overlay( 或 background ),它们为视图所提供建议尺寸都是一致( 与原视图尺寸一致 )。...ScrollView 会使用父视图给定全部建议尺寸创建滚动区域,但在询问其视图需求尺寸时只会提供理想尺寸。...这意味着,在 ScrollView 中,视图最好明确设定尺寸( 提出明确地需求尺寸 )。因此,在上面的代码中,需要通过屏幕高度和视图高度差来计算上方空白站位视图高度。...SwiftUI 在进行布局时,当布局容器给出建议尺寸无法满足全部视图需求尺寸时,会根据视图 Priority,优先满足级别较高视图布局需求。

3.2K00

SwiftUI 方式进行布局

本文通过用多种手段完成同一需求方式,展示 SwiftUI 布局系统强大与灵活,并通过这些示例让开发者对 SwiftUI 布局逻辑有更多认识和理解。 可在 此处 获取本文代码。...无论为同一个视图添加多少层 overlay( 或 background ),它们为视图所提供建议尺寸都是一致( 与原视图尺寸一致 )。...ScrollView 会使用父视图给定全部建议尺寸创建滚动区域,但在询问其视图需求尺寸时只会提供理想尺寸。...这意味着,在 ScrollView 中,视图最好明确设定尺寸( 提出明确地需求尺寸 )。因此,在上面的代码中,需要通过屏幕高度和视图高度差来计算上方空白站位视图高度。...SwiftUI 在进行布局时,当布局容器给出建议尺寸无法满足全部视图需求尺寸时,会根据视图 Priority,优先满足级别较高视图布局需求。

4.7K80

掌握 ViewThatFits

ViewThatFits 视图给出建议尺寸作为自己建议尺寸传递给选择视图,并获得该视图在明确建议尺寸下需求尺寸。...ScrollView:如果理想状态轴与滚动方向一致,则在滚动方向上一次性展示所有的视图而无视父视图建议尺寸。 VStack、HStack、ZStack:所有视图在理想状态下整体呈现。...Rectangle().fill(.yellow) } .fixedSize() 对于这种视图,其“理想呈现”是一个复合状态: 宽度:VStack 逐个询问视图理想尺寸,使用其中宽度最大值作为它需求尺寸...高度:VStack 所有视图理想尺寸高度和 Spacing 和作为自己需求尺寸。...会选择最后一个使用 ScrollView 视图

16710

如何在 SwiftUI 中创建条形图

在 Swift 图表中使用 Foudation 库中测量类型 开始图表布局 SwiftUI 对探索不同布局和预览实时视图结果是很友好。...很容易部分内容提取到视图中,以便每个部分都很小且易于维护。从包含 BarChartView 以及可能其他文本或数据视图开始。...图表会调整到适合它所处容器视图之中。同样图表可以放到任何没有其他视图新试图上,当设备旋转时,图标将会充满空间并调整大小。...图标被设置为固定大小,视图被嵌入到 ScrollView 中,以便在设备旋转时滚动。...SwiftUI 是一个很好平台,用于创建视图和快速重构独立视图。在 SwiftUI 中构建条形图需要做一些工作,随着使用数据来试用条形图,可以确定更多定制化。

5.1K10

SwiftUI 布局 —— 尺寸( 上 )

),我们简述一下 SwiftUI 布局过程( 当前设备为 iPhone 13 Pro ): SwiftUI 布局系统为 ZStack 提供一个建议尺寸( 390 x 763 该尺寸为设备屏幕尺寸去掉安全区域大小...( 85.33 x 20.33,因为 ZStack 中仅有 Text 一个视图,因此 Text 需求尺寸便是 ZStack 需求尺寸 ) SwiftUI 布局系统 ZStack 放置在了 152.33...第二阶段 —— 安置子民 在该阶段,父视图根据 SwiftUI 布局系统提供屏幕区域( 由第一阶段计算得出 )为视图设置渲染位置和尺寸( 上方 5-6 )。...,例如: 在 ZStack 中,ZStack 为视图设置渲染尺寸与视图需求尺寸一致 在 VStack 中,VStack 根据其父视图提供建议尺寸、视图是否为可扩展视图视图视图优先级等信息...x 50 作为需求尺寸返回给父视图 fixedSize() 为视图提供未指定模式建议尺寸 frame(minWidth: 100, maxWidth: 300) 视图需求尺寸控制在指定范围中

4.7K20

掌握 SwiftUI Safe Area

掌握 SwiftUI Safe Area 访问我博客 www.fatbobman.com[1] 可以获得更好阅读体验 Safe Area(安全区域)是指不与导航栏、标签栏、工具栏或其他视图控制器提供视图重叠内容空间...在 UIKit 中,开发者需要利用 safeAreaInsets 或 safeAreaLayoutGuide ,才能确保视图放置在界面中可见部分。 SwiftUI 对上述过程进行了彻底简化。...本文探讨如何在 SwiftUI 中获取 SafeAreaInsets、视图绘制到安全区域之外、修改视图安全区域等内容。...从 iOS 14 开始,SwiftUI 计算视图安全区域时,软键盘在屏幕上覆盖区域(iPadOS 下,软键盘缩小后键盘覆盖区域将被忽略)也一并进行考虑。...safeAreaTabbarDemo1 我们只调整了安全区域, SwiftUI 会自动在不同设备上进行适配(在 iPhone 13 上,状态条高度为 40 + HomeIndeicator区域高度

7.5K31

WWDC 23 ,SwiftUI 5 和 SwiftData 初印象

苹果不仅带来了全新形态硬件产品,还推出了几个相当震撼新框架。本文聊聊我对本届 WWDC 中 SwiftUI 5.0 和 SwiftData 初步印象。...大幅改善了 ScrollView 控制力 本次升级中,为 ScrollView 带来了新动态滚动定位系统( 不依赖 ScrollViewReader 和显式 id 声明)、一次性定位系统( 在视图进入后...,直接定位到滚动视图特定位置,只能使用一次 )、全新滚动条控制( 闪烁 )、可自定义行视图在滚动区域顶端和显示区域显示状态( 例如可用其实现类似 watchOS 中滚动到顶端子视图缩小视觉效果...这是我目前整理一些有关 SwiftData 问题和注意事项( 原文发表在文中,没有进行更系统归纳): 尚不支持公共和共享数据云同步 在当前版本中,通过其他上下文(ModelContext)创建数据并不会自动合并到视图上下文中...性质与通过宏创建 Observed 状态类似,可直接驱动视图更新(传递时无需使用属性包装器) Attribute 派生选项被废弃了 可以在 Xcode 中使用 Model Editor Model

1.1K20

WWDC 23 之后 SwiftUI 有哪些新功能

前言 WWDC 23 已经到来,SwiftUI 框架中有很多改变和新增功能。在本文中将主要介绍 SwiftUI 中数据流、动画、ScrollView、搜索、新手势等功能新变化。...也不再需要 @Published 属性包装器,因为 SwiftUI 视图会自动跟踪任何可观察类型可用属性更改。...在之前 SwiftUI 框架版本中,应该使用 @ObservedObject 属性包装器来订阅更改。现在不需要了,因为 SwiftUI 视图会自动跟踪符合 Observable 协议类型更改。...还有 KeyframeAnimator 视图,可以使用关键帧来实现动画。 ScrollView 今年 ScrollView 有了很多优秀新增功能。...scrollTargetLayout() } .scrollPosition(id: $scrollPosition) } } 如上例所示,使用 scrollPosition 视图修饰符内容偏移量绑定到一个状态属性上

32820

WWDC 23 ,SwiftUI 5 和 SwiftData 初印象

苹果不仅带来了全新形态硬件产品,还推出了几个相当震撼新框架。本文聊聊我对本届 WWDC 中 SwiftUI 5.0 和 SwiftData 初步印象。...大幅改善了 ScrollView 控制力 本次升级中,为 ScrollView 带来了新动态滚动定位系统( 不依赖 ScrollViewReader 和显式 id 声明)、一次性定位系统( 在视图进入后...,直接定位到滚动视图特定位置,只能使用一次 )、全新滚动条控制( 闪烁 )、可自定义行视图在滚动区域顶端和显示区域显示状态( 例如可用其实现类似 watchOS 中滚动到顶端子视图缩小视觉效果...这是我目前整理一些有关 SwiftData 问题和注意事项( 原文发表在文中,没有进行更系统归纳): 尚不支持公共和共享数据云同步 在当前版本中,通过其他上下文(ModelContext)创建数据并不会自动合并到视图上下文中...性质与通过宏创建 Observed 状态类似,可直接驱动视图更新(传递时无需使用属性包装器) Attribute 派生选项被废弃了 可以在 Xcode 中使用 Model Editor Model

35610

SwiftUI 视图生命周期研究

在 app 运行后进行第一次渲染时,SwiftUI 依据类型树按图索骥,创建类型实例,实例 body 根据初始状态计算视图值,并组织成视图值树。...什么是视图 开发者更习惯符合 View 协议结构体或结构体实例视作视图,而在 SwiftUI 角度,视图值树上节点内容,才是它所认为视图。...总之,SwiftUI 根据它自身需要,可能在任意时间、创建任意数量实例。开发者为了适应 SwiftUI 这种特性,唯一可以做就是让结构体构造函数尽可能简单。...•ScrollView + VStack 中,即使 Cell 视图没有出现在可见区域,但它在最开始就会参与容器布局,因此会在创建初始便触发 onAppear,但无论如何滚动,所有的 Cell 视图始终会参与布局...,完成依赖项建立工作•在视图生命周期中,只有一个依赖项副本•在视图生命周期中,无论创建多少个实例,同一时间只有一个实例可以连接到依赖项•依赖项为视图 Source of truth 了解 SwiftUI

4.3K30

解析 SwiftUI 中两处由状态更新滞后引发严重 Bug

本文解析 SwiftUI 中两个由于未能贯彻响应式编程原则而导致严重错误,并提供相应解决方案。...原文发表在我博客 肘子Swift记事本视图变化在前、状态变化在后在 SwiftUI 中,某些可编程控件在执行一定操作时,会先更新视图,待视图变化完成后再修改与其对应状态。...而通过调用环境值或直接修改绑定状态,SwiftUI 则遵循了响应式编程原则,进行了先调整状态,后更新视图操作。...,左上角 Back 按钮消失,但视图并没有返回根视图图片如果我告诉你,上述情况正是由前文提到状态更新滞后所导致,那么你该如何避免这个问题呢?...AttributeGraph 是 SwiftUI 用于维护众多数据源与视图之间依赖关系工具。

597110

SwiftUI 布局协议 - Part2

开始位置和结束位置是一样,因此就 SwiftUI 而言,没有动画。 如果这就是你要找东西,那就太好了,但由于我们视图围绕一个圆圈放置,如果视图沿着那个假想圆圈移动不是更有意义吗?...用户使用容器只需要记住视图封装在 WheelComponent里面。他们不需要担心布局值,绑定,角度等等。当然,不在封装里视图不会受到任何影响,视图不会旋转指向中心。...视图缩放和旋转要再一次使用双向自定义值实现。 在这个例子中在容器中一共有44个视图,所以我们新容器将会分别以12,12,12和8为一圈。 注意本案例中如何使用缓存与视图通信。...此外,在与其他视图布局工作时候,我们就相当于 SwiftUI 角色。布局任何缓存创建和更新都属于我们责任,幸运是,这都很容易处理。我们只需要添加布局缓存到我们自己缓存里。...: ScrollView { Text("Hello world!")

2.7K30

SwiftUI 中创建自适应程序化导航方案

,请参阅 SwiftUI 4.0 全新导航系统[3] 一文。...我们可以 NavigationSplitView 视为具备一些预置能力 HStack,通过在其中声明两个或三个视图从而创建两列或三列导航界面。...但如此一来,自动转换无法应对这类场景。开发者需要自行对两种导航逻辑状态进行转换。方案三演示如何进行这一过程。...比如在本例 Content 列代码中,为了维持这个限定,只能通过 overlay 来定义占位视图。如果代码调整成如下样式,则会在转换后丧失程序化导航能力( 无法通过修改状态,返回上层视图 )。...本着“一案一议”原则,当前方案可以实现对任意导航逻辑进行转换。总结可以在 此处[5] 获取本文全部代码。一次编写便可对应多种设备,这本就是 SwiftUI 一个重要特点。

4.2K30

解析 SwiftUI 中两处由状态更新滞后引发严重 Bug

本文解析 SwiftUI 中两个由于未能贯彻响应式编程原则而导致严重错误,并提供相应解决方案。...视图变化在前、状态变化在后 在 SwiftUI 中,某些可编程控件在执行一定操作时,会先更新视图,待视图变化完成后再修改与其对应状态。这些控件基本上都是对 UIkit(AppKit)二次包装。...而通过调用环境值或直接修改绑定状态,SwiftUI 则遵循了响应式编程原则,进行了先调整状态,后更新视图操作。...,左上角 Back 按钮消失,但视图并没有返回根视图 sheet-dismiss-demo2_Final1693298235.2023-08-29 16_39_51 如果我告诉你,上述情况正是由前文提到状态更新滞后所导致...AttributeGraph 是 SwiftUI 用于维护众多数据源与视图之间依赖关系工具。

27720

SwiftUI 动画机制

同所有 SwiftUI 视图修饰符一样,在代码中所处位置决定了修饰符作用对象和范围。 animation 作用对象仅限于它所在视图层次及该层次节点。 上面两段代码没有对错之分。...此版本 animation 会与所在视图层次和该视图层次节点所有依赖项进行状态关联。...视图和它节点中任何依赖项发生变化,都将满足启用动画插值计算条件,并动画数据传递给作用范围内(视图和它节点)所有可动画部件。...按照设备刷新率( 60 fps/sec 或 120 fps/sec)持续使用 linear 计算结果设置 AnimationDataMonitorView animatableData 属性...由于两个分支视图在转场时会同时出现,因此只有在布局容器中才会正确处理转场动画。Group 只能对其元素进行统一设置,不具备处理两个分支视图同时出现情况(会有一个视图分支转场丢失)。

14.6K40

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

本文演示了如何明确地取消一个任务,并展示了任务是如何自动取消。 该代码建立在在 Swift 中使用 async let 并行运行后台任务中编写AsyncLetApp之上。...为什么要取消一个后台任务 与视图交互可能会触发后台任务运行,进一步交互可能会使最初请求过时,并触发后续后台任务运行。除了浪费资源外,不取消初始任务可能会导致你应用程序出现偶现和意外行为。...Task 创建一个状态属性,并在下载按钮操作视图中将任务分配给该属性。...此方法仍然使用Task状态属性。它被分配给下载按钮中 downloadFiles 函数,任务通过视图取消按钮取消。...中任务 在 SwiftUI 中取消和恢复后台任务 结论 在异步编程中,重要是停止任何不需要后台任务以节省资源并避免后台任务干扰应用程序任何不良副作用。

2.7K30
领券