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

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

创建从底部开始滚动视图Q:我如何实现一个底部对齐滚动视图 macOS 上会不会有糟糕性能?...A:你最好选择是使用 ScrollView 和 ScrollViewReader,并在 onAppear 或新内容进来时滚动到最底部视图。我不建议尝试旋转滚动视图。...目前 SwiftUI 没有 API 可以限制用户字段中输入字符。很希望苹果能够继续扩展基于 FormatStyle 解决方案,让其可以实时对输入内容进行校验。...将背景扩展安全区域Q:如果我有一个自定义容器类型,可以接受一个顶部和底部视图,是否有办法让 API 调用者将所提供视图背景扩展安全区域内,同时将内容( 如文本或按钮 )保留在安全区域内?...这个技巧对于处于屏幕顶部或底部视图十分有用。详情请参阅 推文[15] 。动画转场Q:为什么下面的代码没有显示动画转场。

14.7K30

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

首先创建一个假设性需求: 一个可以展示数万条记录视图 从上个视图进入该视图时不应有明显延迟 可以一键到达数据顶部或底部没有响应延迟 响应迟钝列表视图 通常会考虑采用如下步骤以实现上面的要求:...虽然我们已经找到了导致进入列表视图卡顿原因,但如何在不影响效率情况下通过 scrollTo 来实现列表端点滚动呢?...新问题 细心朋友应该可以注意,运行解决方案一代码后,第一次点击 bottom 按钮时,大概率会出现延迟情况(并不会立即开始滚动)。...,并在首次滚动到列表底部时也没有延迟。...对于拥有复杂结构子视图(尺寸不一致、图文混排) List 来说,在数据量大情况下,任何大跨度滚动( 例如直接滚动到列表底部 )都会给 List 造成巨大布局压力,有不小滚动失败概率。

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

SwiftUI + Core Data App 内存占用优化之旅

我们创建完 100 条数据后,重启应用( 重启可以更精准地测量内存占用情况 )并滚动列表至底部。此时该应用内存占用为 1.6 GB 左右。...正常情况下( 惰性容器中仅包含一个 ForEach ,且子视图没有使用 id 添加显式标识 ),惰性容器仅会创建当前可见范围内视图实例,并对其 body 进行求值( 渲染 )。...Navigator-Debug 尽管上述优化技巧可能会对滚动流畅度产生一定影响( 视觉上不明显 ),不过考虑它所带来巨大收益,本例中应该是一个相当不错选择。...同未优化过代码一样,随着数据量增大,内存占用也将随之提高。 400 条记录情况下滚动底部,内存占用值差不多是 1.75 GB。...,内存占用也仍然被控制一个相当理想状态( 下图为 400 条数据滚动底部内存占用情况 )。

1.2K10

SwiftUI + Core Data App 内存占用优化之旅

我们创建完 100 条数据后,重启应用( 重启可以更精准地测量内存占用情况 )并滚动列表至底部。此时该应用内存占用为 1.6 GB 左右。...正常情况下( 惰性容器中仅包含一个 ForEach ,且子视图没有使用 id 添加显式标识 ),惰性容器仅会创建当前可见范围内视图实例,并对其 body 进行求值( 渲染 )。...图片 尽管上述优化技巧可能会对滚动流畅度产生一定影响( 视觉上不明显 ),不过考虑它所带来巨大收益,本例中应该是一个相当不错选择。...同未优化过代码一样,随着数据量增大,内存占用也将随之提高。 400 条记录情况下滚动底部,内存占用值差不多是 1.75 GB。...图片 可以加大检测力度,即使在生成了 400 条记录情况下,内存占用也仍然被控制一个相当理想状态( 下图为 400 条数据滚动底部内存占用情况 )。

2.4K40

掌握 SwiftUI Safe Area

除非开发者明确要求视图突破安全区域限制,否则 SwfitUI 将尽力确保开发者创建视图都被布局安全区域当中。SwiftUI 同时提供了一些方法和工具让开发者对安全区域有所控制。...本文将探讨如何在 SwiftUI 中获取 SafeAreaInsets、将视图绘制安全区域之外、修改视图安全区域等内容。...默认情况下会将用户视图置于安全区之内,因此我们只能得到如下结果: image-20211120141245282 为了让视图能够突破安全区域限制,SwiftUI 提供了 ignoresSafeArea...•all(默认)上述两种安全区域划分合集 iOS 13 并没有提供键盘自动避让功能,开发者需要编写一些额外代码来解决软键盘不恰当遮盖视图(如 TextField )问题。...safeAreaInsetList2 遗憾是, iOS 15 之前,SwiftUI没有提供调整视图安全区手段,如果我们想通过 SwiftUI 手段创建一个自定义 Tabbar 时,列表中最后内容将被

7.5K31

SwiftUI 方式进行布局

初始状态时( show == false ),视图一( 红色视图底部与屏幕底部对齐,当 show == true 时,视图二( 绿色视图底部与屏幕底部对齐。...四、ScrollView 考虑本文需求动画形态( 竖向滚动 ),使用 ScrollViewReader 提供滚动定位功能,同样可以满足需求。...因此,只需要在状态切换时,调整视图对齐指南即可( 视图一将自动跟随视图二移动 )。 此种方式视觉上与通过 VStack 实现类似,但两者需求尺寸上有明显不同。...七、Transition 通过为视图设定 Transition( 转场 ),视图插入或将其移出视图树时,SwiftUI自动生成对应动画效果。...尽管当前需求仅有两个视图,但我们仍然可以从中提炼出场景特性:垂直排列前提下,特定状态时,指定视图底部与容器视图底部对齐。

3.2K00

SwiftUI 方式进行布局

初始状态时( show == false ),视图一( 红色视图底部与屏幕底部对齐,当 show == true 时,视图二( 绿色视图底部与屏幕底部对齐。...四、ScrollView 考虑本文需求动画形态( 竖向滚动 ),使用 ScrollViewReader 提供滚动定位功能,同样可以满足需求。...因此,只需要在状态切换时,调整视图对齐指南即可( 视图一将自动跟随视图二移动 )。 此种方式视觉上与通过 VStack 实现类似,但两者需求尺寸上有明显不同。...七、Transition 通过为视图设定 Transition( 转场 ),视图插入或将其移出视图树时,SwiftUI自动生成对应动画效果。...尽管当前需求仅有两个视图,但我们仍然可以从中提炼出场景特性:垂直排列前提下,特定状态时,指定视图底部与容器视图底部对齐。

4.7K80

WWDC 23 ,SwiftUI 5 和 SwiftData 初印象

SwiftUI 如果说从 SwiftUI 1.0 4.0 每年升级是一种小修小补行为,那么今年苹果在 SwiftUI 5.0 上做出努力至少算得上是中期改款了。...大幅改善了 ScrollView 控制力 本次升级中,为 ScrollView 带来了新动态滚动定位系统( 不依赖 ScrollViewReader 和显式 id 声明)、一次性定位系统( 视图进入后...,直接定位滚动视图特定位置,只能使用一次 )、全新滚动条控制( 闪烁 )、可自定义行视图滚动区域顶端和显示区域显示状态( 例如可用其实现类似 watchOS 中滚动到顶端子视图缩小视觉效果...不考虑兼容旧版本情况下,我认为 SwiftUI 5.0 升级可以打 95 分(满分 100 分),不过考虑很多开发者相当一段时间内还无法使用这些新功能,心情就会异常低落。...这是我目前整理一些有关 SwiftData 问题和注意事项( 原文发表推文中,没有进行更系统归纳): 尚不支持公共和共享数据云同步 在当前版本中,通过其他上下文(ModelContext)创建数据并不会自动合并到视图上下文中

1.1K20

WWDC 23 ,SwiftUI 5 和 SwiftData 初印象

欢迎大家 Discord 频道[2] 中进行更多地交流 SwiftUI 如果说从 SwiftUI 1.0 4.0 每年升级是一种小修小补行为,那么今年苹果在 SwiftUI 5.0 上做出努力至少算得上是中期改款了...大幅改善了 ScrollView 控制力 本次升级中,为 ScrollView 带来了新动态滚动定位系统( 不依赖 ScrollViewReader 和显式 id 声明)、一次性定位系统( 视图进入后...,直接定位滚动视图特定位置,只能使用一次 )、全新滚动条控制( 闪烁 )、可自定义行视图滚动区域顶端和显示区域显示状态( 例如可用其实现类似 watchOS 中滚动到顶端子视图缩小视觉效果...不考虑兼容旧版本情况下,我认为 SwiftUI 5.0 升级可以打 95 分(满分 100 分),不过考虑很多开发者相当一段时间内还无法使用这些新功能,心情就会异常低落。...这是我目前整理一些有关 SwiftData 问题和注意事项( 原文发表推文中,没有进行更系统归纳): 尚不支持公共和共享数据云同步 在当前版本中,通过其他上下文(ModelContext)创建数据并不会自动合并到视图上下文中

35010

深入了解 SwiftUI 5 中 ScrollView 新功能

SwiftUI 5.0 中,苹果大幅强化了 ScrollView 功能。新增了大量新颖、完善 API。本文将对这些新功能进行介绍,希望能够让它们更多、更早帮助有需要开发者。...它只影响滚动视图初始状态,一次性设置。通常用于实现类似初始状态从底部显示 IM 应用、从 trailing 开始显示数据等情况。通过 UnitPoint 可以同时设置两个轴向初始位置。...可采用 优化 SwiftUI List 中显示大数据集响应效率[5] 一文中介绍方式来解决。 scrollPostion(id:) 使用此修饰符可以让滚动视图滚动到特定位置。....automatic 是默认行为,紧凑水平尺寸类中受限,否则不受限。 .always 始终限制可滚动视图数量。 .never 不限制可滚动视图数量。...总结 我完全没有想到, SwiftUI 5 中,苹果对 ScrollView 进行了全面增强。值得赞赏是,他们不仅提供了一些一直期待功能,而且 API 设计和实现完成度上都非常出色。

67620

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

,会自动将其设置为当前高亮关键字并滚动视图中心位置scrollTo_keyword2_2022-08-22_09.06.20.2022-08-22 09_07_57在对话数据较多情况下(上千条)不应有性能瓶颈解决思路一千个人眼中有一千个哈姆雷特...image-20220822161247454点击切换按钮定位对应搜索结果为 TranscriptionRow 视图添加显式标识符,并通过 ScrollViewProxy 滚动到指定位置。...请阅读 优化 SwiftUI List 中显示大数据集响应效率[6] 以及 避免 SwiftUI 视图重复计算[7] 两篇文章,了解更多有关性能优化方面的内容通过 currentPostion 获取需要滚动...SwiftUI 视图中打开 URL 若干方法[10] 一文,了解更多有关 OpenURLAction 内容创建体验感优秀搜索条使用 safeAreaInset 添加搜索栏没有 safeAreaInset...总结范例代码并没有十分刻意地创建规范数据流,但由于做到视图与数据分离,因此将其改写成任何你想使用数据流方式并非难事。

4.2K30

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

众所周知,SwiftUI 是一个响应式框架,这意味着,当数据源发生变化时,框架会自动更新视图。同样,当我们想调整视图显示时,应直接对状态进行修改。...但是,SwiftUI一些系统控件并没有完全遵循响应式设计原则,由此某些情况下会出现严重错误,影响用户体验,并使开发者无所适从。...原文发表博客 肘子Swift记事本视图变化在前、状态变化在后 SwiftUI 中,某些可编程控件执行一定操作时,会先更新视图,待视图变化完成后再修改与其对应状态。...再次执行上述过程,您会发现在返回上层视图后,应用并不会锁死,一切都恢复了正常。然而,明显地,强迫用户点击 “Dismiss” 按钮并不是一个好选择,特别是没有屏蔽手势取消 Sheet 情况下。...当视图正在滚动时返回上一层视图会导致应用崩溃这是一个由 xiaogd Discord 论坛中提出 问题。

589110

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

创建与 IM 应用类似的底部文字输入栏Q:你好,我问题是关于 TextField 。...使用 environmentObject 情况下,如何避免创建实例视图被重新计算Q:如何在避免重新计算顶层视图 body 情况下不同子树两个子视图之间共享状态( 例如 ObservableObject...但是从一个文本字段下一个文本字段聚焦感觉不够流畅,而且每当我一个文本字段中输入一个字母时,我 CPU 使用率似乎会飙升到 70% — 100%。...跨视图层次共享Q:在数据来自 API 响应情况下多个视图之间共享数据最佳方式是什么?...某些情况下,利用惰性视图修饰器,不仅可以保持视图身份稳定,同时也能获得 SwiftUI 更多优化。例如用 .opacity(value < 10 ?

12.2K20

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

比如在 SwipeCell[3] 中,需要在可滚动组件开始滚动时,自动关闭已经打开侧滑菜单。遗憾是,SwiftUI没有提供这方面的 API 。...本文将介绍几种 SwiftUI 中获取当前滚动状态方法,每种方法都有各自优势和局限性。...模式,因此无法有效地区分滚动是由那个控件造成方法三:PreferenceKey SwiftUI 中,子视图可以通过 preference 视图修饰器向其祖先视图传递信息( PreferenceKey...preference 与 onChange 调用时机非常类似,只有值发生改变后才会传递数据。 ScrollView、List 发生滚动时,它们内部视图位置也将发生改变。...判断准确度没有前两种方式高当可滚动组件中内容出现了非滚动引起尺寸或位置变化( 例如 List 中某个视图尺寸发生了动态变化 ),本方式会误判断为发生了滚动,但在视图变化结束后,状态会马上恢复滚动结束滚动开始后

3.7K40

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

众所周知,SwiftUI 是一个响应式框架,这意味着,当数据源发生变化时,框架会自动更新视图。同样,当我们想调整视图显示时,应直接对状态进行修改。...但是,SwiftUI一些系统控件并没有完全遵循响应式设计原则,由此某些情况下会出现严重错误,影响用户体验,并使开发者无所适从。...然而,明显地,强迫用户点击 “Dismiss” 按钮并不是一个好选择,特别是没有屏蔽手势取消 Sheet 情况下。...当视图正在滚动时返回上一层视图会导致应用崩溃 这是一个由 xiaogd Discord 论坛中提出 问题[3]。...请至少进入第三级视图 滚动当前视图视图处于滚动状态时,点击 NavigationStack 左上角 “Back” 按钮。

26720

WWDC 23 之后 SwiftUI 有哪些新功能

也不再需要 @Published 属性包装器,因为 SwiftUI 视图自动跟踪任何可观察类型可用属性更改。...之前 SwiftUI 框架版本中,应该使用 @ObservedObject 属性包装器来订阅更改。现在不需要了,因为 SwiftUI 视图自动跟踪符合 Observable 协议类型更改。...动画 动画始终是 SwiftUI 框架中最重要部分。 SwiftUI 中轻松实现任何动画,但之前框架版本缺少一些现在具有的功能。...每当用户滚动视图时,它会通过设置第一个可见视图标识来更新绑定。...它允许滚动视图中启用分页。 搜索 与搜索相关视图修饰符也有一些很好新增功能。例如,可以通过编程方式聚焦搜索字段。

32420

SwiftUI TextField 进阶 —— 事件、焦点、键盘

多个 TextFiled 之间切换焦点 通过使用 focused 和 onSubmit 结合,我们可以实现当用户一个 TextField 中输入完成后(点击return),自动让焦点切换到下一个...通过 TextContentType 获得建议 使用某些 iOS app 时,录入文字时会在软键盘上方自动提示我们需要输入内容,比如电话、邮件、验证码等等。...取消键盘 有些情况下,在用户输入完毕后,我们需要取消软键盘显示,以便留出更大显示空间。某些键盘类型并没有return按键,因此我们需要使用编程方式让键盘消失。...将键盘辅助视图集成 toolbar 逻辑中也有些令人令人费解。 通过 UIKit 创建 当前阶段,通过 UIKit 来创建键盘辅助视图仍是 SwiftUI最优方案。...不同视图种类(例如 List、Form、ScrollView)中,或使用辅助视图、textContentType 情况下都可以避免遮挡正在输入 TextField。

13.1K10

掌握 ViewThatFits

iOS 16 中,SwiftUI 增加了一个新自适应布局容器 ViewThatFits。正如其名称所示,它作用是在给定多个视图中找出最合适视图并使用。...通常这个顺序是从最大最小,但由于一个视图可能在一个受限轴上适应但在另一个轴上不适应,所以这并不总是如此。默认情况下,ViewThatFits 水平和垂直轴上都进行约束。...用更容易理解语言来说,理想尺寸就是一个视图不给其任何尺寸限定(理想外部环境)情况下,其最理想呈现结果所占用尺寸。 对于不同种类视图,它们理想呈现处理规则是不同。...ScrollView:如果理想状态轴与滚动方向一致,则在滚动方向上一次性展示所有的子视图而无视父视图建议尺寸。 VStack、HStack、ZStack:所有子视图在理想状态下整体呈现。...自适应滚动 通过下面的代码,我们可以实现在内容宽度超过给定宽度时,自动进入可滚动状态。

15710

解析SwiftUI布局细节(二)循环轮播+复杂布局

NavigationView + NavigationLink 界面跳转,苹果给 SwiftUI 使用例子中就是这样写,当然我们正常使用中这样写也没啥问题,那我们界面跳转问题是什么呢?...GeometryReader 主要作用就是能够获取到父View建议尺寸,这就是它主要作用,要没有它我们面临可能就是无休止传值了,SwiftUI 既然是声明式UI,按我理解你就没有办法去获取某一个视图视图之类...3、再提一点关于上面说滚动视图UIKit中我们可以用UICollectionView搞定一切,但是SwiftUI没有这个控件,我建议采用方式是 ScrollView + HStack + VStack...方式去实现,很多同行有说目前来看SwiftUIList在数据量大情况下性能不是特别好,采用ScrollView是个不错方式,而且也很容易构建出来,并不是说每一个Item位置都需要你去计算,...循环轮播实现 ---- 总结一下循环轮播怎么实现,采用方案就是 HStack + Gesture + Timer 方式,这三者就能实现一个自动循环滚动或者手动滚动轮播。

11.8K20
领券