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

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

本文将介绍几种 SwiftUI 获取当前滚动状态方法,每种方法都有各自优势和局限性。...: UIScrollView, willDecelerate decelerate: Bool)手指拖动结束后( 手指离开 ),调用此方法 SwiftUI ,很多视图控件是对 UIKit( AppKit...模式,因此无法有效地区分滚动是由那个控件造成方法三:PreferenceKey SwiftUI ,子视图可以通过 preference 视图修饰器向其祖先视图传递信息( PreferenceKey...preference 与 onChange 调用时机非常类似,只有值发生改变后才会传递数据。 ScrollView、List 发生滚动,它们内部子视图位置也将发生改变。...判断准确度没有前两种方式高当可滚动组件内容出现了非滚动引起尺寸位置变化( 例如 List 某个视图尺寸发生了动态变化 ),本方式会误判断为发生了滚动,但在视图变化结束后,状态会马上恢复到滚动结束滚动开始后

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

掌握 SwiftUI Safe Area

UIKit ,开发者需要利用 safeAreaInsets safeAreaLayoutGuide ,才能确保将视图放置界面可见部分。 SwiftUI 对上述过程进行了彻底简化。... SwiftUI ,开发者通常只有需要获取 StatusBar + NavBar 高度 HomeIndeicator + TabBar 高度才会使用到 safeAreaInsets 。...使用 safeAreaInset 扩展安全区域 SwiftUI ,所有基于 UIScrollView 组件(ScrollView、List、Form),默认情况下都会充满整个屏幕,但仍可确保我们可以安全区域内看到所有的内容...safeAreaInset 修饰符出现解决了上述问题。通过 safeAreaInset,我们可以缩小视图安全区域,以确保所有内容都可以按预期显示。...尽管使用 safeAreaInset 为列表底部添加状态栏自定义 TabBar 非常方便,但如果你列表中使用了 TextField,情况将变得很麻烦。

7.5K31

Text 实现基于关键字搜索和定位

本节内容仅代表我考虑处理上述问题想法和思路。其中不少功能已经超出了原本需求,增加这些功能一方面有利于更多地融汇以前博客知识点,另一方面也提高了解题乐趣。...ForEach 形式 ) View 添加显式标识符后( 使用 id 修饰器),视图刷新,List 将会为 ForEach 所有视图创建实例( 并非渲染 )用以比对视图类型构造参数是否发生变化...positionProxy[currentPosition]}通过 onChange 比较 transcriptionID 变化前后值,减少不必要滚动考虑到使用阅读感受,我希望如果当前定位...List ,每个视图进入显示窗口都会调用它 onAppear,每个视图退出显示窗口都会调用它 onDisapper。..._25_53搜索条出现时,让 TextField 获得焦点通过 @FocusState ,让 TextField 搜索条出现时,自动获得焦点,从而自动开启键盘。

4.2K30

SwiftUI 视图生命周期研究

SwiftUI 视图 SwiftUI ,视图定义了一块用户界面,并以视图树形式组织在一起,SwiftUI 通过解析视图树来创建合适渲染。...通常情况下,SwiftUI 需要渲染屏幕某个区域需要该区域数据配合布局,会在视图值树上创建对应视图。当不再需要其参与布局渲染视图将被销毁。...比如在 List 和 LazyVStack ,Cell 视图创建之后即使滚动出屏幕不参与布局与渲染,但 SwiftUI 仍会保留这些视图数据,直到 List LazyVStack 被销毁。...这在相当程度上改善了因多次创建实例而引发效率问题。 让复杂任务仅执行一次 但是,onAppear task 也并非只会执行一次,如何保证让某些负担较重任务只页面执行一次呢?...在前文视图值树介绍我们提到,当 SwiftUI 重建该树,如果树上某个节点(视图) Source of truth 没有发生变化,将不重新计算,直接使用旧值。

4.3K30

SwiftUI 动画机制

阅读本文前,读者最好已拥有 SwiftUI使用动画编程经历,SwiftUI 动画基本使用方法有一定了解。可以 此处获取本文全部代码[2] SwiftUI 动画是什么?... SwiftUI ,我们不能命令某个视图从一个位置移动到另一个位置,为了实现上述效果,我们需要声明该视图状态 A 所处位置以及状态 B 所处位置,当由状态由 A 转到 B SwiftUI...另外需要注意是,使用 withAnimation ,必须明确地让依赖项出现在闭包,否则 withAnimation将不起作用。...由于两个分支视图转场时会同时出现,因此只有布局容器才会正确处理转场动画。Group 只能对其子元素进行统一设置,不具备处理两个分支视图同时出现情况(会有一个视图分支转场丢失)。...因此有很大可能因为对视图识别错误,而产生动画异常。下面的动图中,当出现相同元素SwiftUI 给出了警告提示。

14.6K40

深度解读 Observation —— SwiftUI 性能提升新途径

WWDC 2023 ,苹果介绍了 Swift 标准库新成员:Observation 框架。它出现有望缓解开发者长期面临 SwiftUI 视图无效更新问题。...这导致 SwiftUI ,极易产生了大量不必要视图刷新,从而影响 SwiftUI 应用性能。 为了改善这些限制,Swift 5.9 版本推出了 Observation 框架。...开发者可以提供一段宏定义,该定义会在编译器编译源代码执行,并对源代码进行修改、添加删除等操作。...因此,不久后,引用类型和值类型注入形式上将获得高度统一( 几乎不会再出现使用 environmentObject StateObject 场景 )。...另外, 我们之前视图中很多优化技巧也将发生改变。例如,使用 ObservableObject ,我们会通过只引入与当前视图有用数据,来减少不必要刷新。

49820

从前端视角看 SwiftUI

,但也因为繁琐方法定义与 this 混淆, React16 hooks 出现之后,逐渐提倡使用 function component 与 hooks 方式来建立元件。...例如早期 react-redux connect。 render props[4]:将实际渲染元件当作属性(props)传入,并提供必要参数供实作端使用。...side effect 操作 Redux 当中会统一由 middleware 处理,而在 TCA 架构 reducer 可以回传一个 Effect,代表接收 action 所要执行 IO 操作或是...我还蛮想了解 SwiftUI 背后是怎么计算 diff ,希望之后有类似的文章出现 @State 修饰符可用来定义元件内部状态,当状态改变时会更新并反映到画面。...,减少不必要比对,React 会要求开发者提供 key,而在 SwiftUI 当中也有类似的机制,开发者必须使用叫做 Identifiable[11] protocol,或是显式地传入 id。

3.5K20

用 Table SwiftUI 下创建表格

欢迎大家 Discord 频道[2] 中进行更多地交流 Table 是 SwiftUI 3.0 为 macOS 平台提供表格控件,开发者通过它可以快捷地创建可交互多列表格。...( 在数据量很大 ),可以只使用最后创建排序条件: .onChange(of: order) { newOrder in if let singleOrder = newOrder.first...转换成 SortDescription( NSSortDescription ) 用于 Core Data ,请不要使用 Core Data 无法支持 Compare 算法。...如果你 Xcode 编写使用 Table 代码,大概率会碰到自动提示无法工作情况。甚至还会出现应用程序无法编译,但没有明确错误提示( 错误发生在 Table 内部)。...出现上述问题主要原因是,苹果没有采用其他 SwiftUI 控件常用编写方式( 原生 SwiftUI 容器包装 UIKit 控件),开创性地使用了 result builder 为 Table 编写了自己

3.9K30

掌握 SwiftUI task 修饰器

用 “出现之前” 来描述 onAppear task 闭包调用时机属于无奈之举。不同上下文中,“出现之前”会有不同解释。...Hide Timer 按钮后,app 出现了无法响应且控制台仍在持续输出( 不按照原定间隔时间 )情况,为什么会出现这样问题呢?...使用 url.lines 和 url.resourceBytes 获取网络数据,系统 API 会跳转到后台线程,不过最终仍会回到主线程上想要了解并解决这个问题,我们还要从 task 修饰器定义入手...回到当前问题,由于 View 协议限定了 body 属性必须运行于主线程使用了 @MainActor 进行标注 ),因此,如果我们直接在 body 为 task 修饰器添加闭包代码,那么该闭包只能运行于主线程...使用 task 替换 onReceive 可以获得两个好处:减少视图不必要刷新( 避免重复计算 )在后台线程响应消息,减少主线程负荷为老版本 SwiftUI 添加 task 修饰器当前,Swift

2.2K30

ObservableObject研究

更详细分析请参见 @State研究 即使你只View中发送action,并没有显示State数据使用其做判断,该View也会被强制刷新。...首先不要在代码添加不必要依赖声明;对于那些只需要发送Action但并不使用StateView,将store定义成全部变量,无需注入直接使用。...区域范围内来创建被维持一个小状态,主要可以使用以下几种手段: •善用@State @State研究 这篇文章,我们讨论了SwiftUI对于@State优化问题。...•只对原有的程序结构做微小调整•State每个元素都会在自改动独立发出通知•每个View可以只与自己有关State元素创建依赖•对Binding完美支持 追加:减少代码量 实际使用...onReceive而可能出现问题

2.4K60

SwiftUI 中用 zIndex 调整视图显示顺序

本文将对 SwiftUI zIndex 修饰符做以介绍,包括:使用方法、zIndex 作用域、通过 zIndex 避免动画异常、为什么 zIndex 需要设置稳定值以及多种布局容器内使用 zIndex...访问我博客 www.fatbobman.com[1] 可以获得更好阅读体验 zIndex 修饰符 SwiftUI ,开发者使用 zIndex 修饰符来控制重叠视图间显示顺序,具有较大 zIndex...当一个视图有多个 zIndex 修饰符,视图将使用最内层 zIndex 值 struct ScopeDemo: View { var body: some View { ZStack...zIndex 值相同(比如全部使用默认值 0 ),SwiftUI 会按照布局容器布局方向( 视图代码闭包出现顺序 )对视图进行绘制。...zIndex 并非 ZStack 专利 尽管大多数人都是 ZStack 中使用 zIndex ,但 zIndex 也同样可以使用在 VStack 和 HStack ,且通过和 spacing 配合

1.7K30

onAppear 调用时机

onAppear( task )是 SwiftUI 开发者经常使用一个修饰符,但一直没有权威文档明确它闭包被调用时机。...本文将通过 SwiftUI 4 提供新 API ,证明 onAppear 调用时机是布局之后、渲染之前。问题同之前多篇博客类似,我们还是从 聊天室 一个 问题 开始。...图片请忽略例子写法是否合理和值得推荐,仅考虑为什么第一段代码出现了数组越界情况;以及第二段代码可以正确运行。...这会让开发者误以为 onAppear 是视图渲染后( 使用者看到后 )才被调用。但在 SwiftUI ,onAppear 实际上是渲染前被调用。...不考虑使用绝对索引值是否正确情况下,通过下面的代码,便可以避免问题出现:if !

2K20

Ask Apple 2022 与 SwiftUI 有关问答(下)

如果你要渲染许多相关控件,使用 Form 会在 iOS 和 macOS 上有最好默认体验。...当视图结构过于复杂,除了难以阅读外,还会出现无法使用代码自动补全以及上文提到无法编译( too complex to type check )情况。...Q&A ( 集锦 - 简体中文 )下文中问题来自开发者与苹果工程师【 集锦 - 简体中文 】频道进行中文讨论( 没有出现在英文 SwiftUI 频道 )。我直接对其进行了复制粘贴。...如果通过 Feedback Assistant 提交过此问题,请告诉我们 Feedback ID。这是一个多个版本中都出现奇怪问题。... SwiftUI 早期版本,当在 iOS 中使用系统中文输入法,很容易触发这种情况。但后期逐步得到了修复。近期,聊天室我也看到了类似的讨论( 我本人尚未在 iOS 16 上遇到 )。

14.7K30

掌握 SwiftUI task 修饰器

用 “出现之前” 来描述 onAppear task 闭包调用时机属于无奈之举。不同上下文中,“出现之前”会有不同解释。...)情况,为什么会出现这样问题呢?...使用 url.lines 和 url.resourceBytes 获取网络数据,系统 API 会跳转到后台线程,不过最终仍会回到主线程上 想要了解并解决这个问题,我们还要从 task 修饰器定义入手...回到当前问题,由于 View 协议限定了 body 属性必须运行于主线程使用了 @MainActor 进行标注 ),因此,如果我们直接在 body 为 task 修饰器添加闭包代码,那么该闭包只能运行于主线程...使用 task 替换 onReceive 可以获得两个好处: 减少视图不必要刷新( 避免重复计算 ) 在后台线程响应消息,减少主线程负荷 为老版本 SwiftUI 添加 task 修饰器 当前,Swift

3.5K60

一段因 @State 注入机制所产生“灵异代码”

State 注入优化机制 SwiftUI ,对于引用类型,开发者可以通过 @StateObject、@ObservedObject @EnvironmentObject 将其注入到视图中。...这意味着,即使我们定义视图结构体声明了使用 @State 标注变量,但只要 body 没有使用该属性( 通过 ViewBuilder 支持语法 ),即使该属性发生变化,视图也不会刷新。....id(n) .onChange(of:n){_ in } // id onChange 均可以不添加显示内容情况下,创建关联在 创建自适应高度 Sheet 推文[4] ,我便使用过 id...方案二、使用 @StateObject 强制刷新我们可以通过创建引用类型 Source 来避免不同上下文之间关联 State 可能出现顺序错误。...面对这些“灵异现象”,如果我们能对其进行更多研究,那么不仅可以今后避免类似的问题,而且分析过程,也能对 SwiftUI 各种运行机制有深入掌握。希望本文能够对你有所帮助。

1.9K20

onAppear 调用时机

onAppear( task )是 SwiftUI 开发者经常使用一个修饰符,但一直没有权威文档明确它闭包被调用时机。...本文将通过 SwiftUI 4 提供新 API ,证明 onAppear 调用时机是布局之后、渲染之前。 问题 同之前多篇博客类似,我们还是从 聊天室 一个 问题开始。...创建实例、求值、布局、渲染 SwiftUI ,一个视图生命周期中通常会经历四个阶段: 创建实例 视图树,处于可显示分支视图基本上都会经历一个阶段。...这会让开发者误以为 onAppear 是视图渲染后( 使用者看到后 )才被调用。但在 SwiftUI ,onAppear 实际上是渲染前被调用。...不考虑使用绝对索引值是否正确情况下,通过下面的代码,便可以避免问题出现: if !

1.1K10

Ask Apple 2022 与 SwiftUI 有关问答(上)

A:EnvironmentObject 是一个很好工具。如果你不想让父视图也被更新,可以创建对象使用 @StateObject @ObservedObject 。...我是 SwiftUI 新手。我问题是关于场景。几乎所有教程和示例代码库,只使用了一个 WindowGroup 场景,所有内容都嵌套在 ContentView 。...最近,我注意到 SwiftUI 视图 onAppear 在意想不到时间启动,比如当 UITabBarController 被创建,而不是当视图本身出现时。...2、当视图出现在 UITabBarController ,推荐执行代码方法是什么?...A:如果你 iOS 上使用 UITextField 遇到性能问题,你可以尝试避免每个视图都是 UITextField ,默认渲染为 Text ,当文本被点击动态切换为 UITextField 。

12.2K20

SwiftUI TextField进阶——格式与校验

作为UITextField(NSTextField)SwiftUI封装,苹果为开发者提供了众多构造方法和修饰符以提高其使用便利性、定制性。...因此,最近几个月时间里,我逐渐抛弃了通过自行封装使用其他第三方扩展库来实现某些需求思路。...可能屏蔽字符解决思路 •使用UITextFieldDelegatetextField方法•SwiftUI视图中,使用onChange录入发生变化时进行判断并修改 第一种思路,仍需使用Introspect...其他需要注意问题 使用上面的思路进行实际编程前,我们还需要考虑其他几个问题: 本地化 本文提供演示代码[6]实现了对Int和Double两种类型实时处理。...,方案二,所有的逻辑都是onChange激发调用

8.1K20
领券