struct LazyHStack (英文)
struct LazyVStack (英文)
你的 App 需要在容器视图中显示的数据经常会超过设备屏幕上容许的空间。对于重复视图或视图组,水平 Stack 和垂直 Stack 是很好的解决方案,但它们没有内建的滚动机制。你可以通过将 Stack 包装在 Scroll
(英文) 中来添加滚动,并在出现性能问题时切换到惰性 Stack。
实施重复视图或视图组很简单,只需将它们包装在 Scroll
(英文) 内的 HStack
(英文) 或 VStack
(英文) 中即可。
ScrollView(.horizontal) {
HStack {
ProfileView()
ProfileView()
ProfileView()
ProfileView()
ProfileView()
}
}
.frame(maxWidth: 500)
如果上述示例代码中的 Profile
具有 200 x 200 点的固有内容大小,则 frame(min
(英文) 视图修饰符将 500 点的最大宽度应用于 Scroll
(英文) 会导致 Stack 在其内部滚动。
有关如何使用 Stack 将视图组合在一起的介绍,请参阅“使用 Stack 视图构建布局”。
使用 For
(英文) 来为你 App 中的数据创建重复视图。从 profiles
数组中的一个个人资料数据列表中,在 HStack
(英文) 内使用 For
(英文) 为数组中的每个元素创建一个 Profile
。
ScrollView(.horizontal) {
HStack {
ForEach(profiles) { profile in
ProfileView(profile: profile)
}
}
}
.frame(maxWidth: 500)
注释
当你使用 For
(英文) 时,你迭代的每个元素必须经过唯一标识。可以使元素遵从 Identifiable
(英文) 协议,或者将一个键路径传递到唯一的标识符作为 init(_:
(英文) 的 id
参数。
HStack
(英文)、VStack
(英文) 和 ZStack
(英文) 三个标准 Stack 视图在显示时都会载入它们的所含视图层次结构,而一次性载入大量视图会导致运行时性能变慢。
在以上示例中,Profile
是一个包含嵌套 Stack 视图、文本标签和图像视图的复合视图。一次性载入大量个人资料会导致明显的速度变慢。
随着 Stack 中的视图数量增加,请考虑使用 Lazy
(英文) 和 Lazy
(英文) 代替 HStack
(英文) 和 VStack
(英文)。惰性 Stack 按需载入和渲染子视图,从而在载入大量子视图时可提供显著的性能提升。
Stack 视图和惰性 Stack 具有相似的功能,可能给人感觉它们能够互换,但是,它们在不同情况下有各自的优势。Stack 视图会一次性载入所有子视图,布局性能快且可靠,因为系统在载入每个子视图时就知道它们的大小和形状。惰性 Stack 会为了性能而损失一定程度的布局正确性,原因是系统仅在子视图可见时才会计算它们的几何结构。
在选择要使用的 Stack 视图类型时,始终先选择标准 Stack 视图,并且仅在对代码进行性能分析后证明值得提升性能时才切换到惰性 Stack。
考虑要使用哪种 Stack 时,请使用 Instruments 工具对你的 App进行性能分析,以确定用户界面代码中将有大量视图载入 Stack 的区域。
若要对 SwiftUI 视图载入进行性能分析,请打开 Instruments 工具,方法是在 Xcode“Product”(产品) 菜单中选择“Profile”(性能分析),然后选取 SwiftUI 性能分析模板。该模板将载入四个 instrument:View Body、View Properties、Core Animation Commits 和 Time Profiler。这些 instrument 的组合为你寻找加快 App 性能的机会提供了一个不错的起点。
注释
切勿使用 iOS 模拟器对你的代码进行性能分析。请始终使用真实设备进行性能测试。
对上述代码进行性能分析时,View Body instrument 显示 1,000 个 Profile
实例同时作为 HStack
(英文) 载入内存。随着系统载入每个个人资料,你还会看到相同数量的 Image
(英文) 视图载入。
在此情况下,解决方案是将 HStack
(英文) 替换为 Lazy
(英文),如以下代码所示:
ScrollView(.horizontal) {
LazyHStack {
ForEach(profiles) { profile in
ProfileView(profile: profile)
}
}
}
.frame(maxWidth: 500)
运行另一次跟踪会显示最初载入的视图数量急剧下降,因为只有四个启动的 Profile
实例可见。你还可以在“Total Duration”(总时间长度) 列中看到相应的下降。
有关使用 Instruments 工具的更多信息,请参阅提升 App 的性能。
struct LazyHStack (英文)
struct LazyVStack (英文)
小叶苦丁茶有什么作用和功效 | 粘粉是什么粉 | 客源是什么意思 | 什么是拘役 | 恨嫁什么意思 |
龙蛇混杂是什么意思 | 大腿痛挂什么科 | 梦见梨是什么意思 | 中药龙骨是什么东西 | 手臂长斑是什么原因 |
杜甫被后人称为什么 | 猴与什么属相相配最好 | 北边是什么生肖 | allan英文名什么意思 | 胃肠外科是看什么病的 |
为什么说金克木生财 | 火气重吃什么降火 | 亡羊补牢的亡是什么意思 | dwi是什么意思 | 开心果是什么意思 |
月老叫什么名字hcv8jop6ns0r.cn | 运筹帷幄是什么意思hcv7jop4ns5r.cn | 电镀对人体有什么危害wuhaiwuya.com | 淋巴结是什么引起的hcv8jop9ns7r.cn | 华盖是什么hcv7jop9ns5r.cn |
咽喉老有痰是什么原因hcv8jop0ns9r.cn | 梦见吃月饼是什么意思hcv9jop5ns8r.cn | 10点半是什么时辰520myf.com | 旅游的意义是什么hcv7jop6ns3r.cn | 贫血吃什么ff14chat.com |
银耳有什么功效hcv7jop6ns2r.cn | 儿童贫血吃什么补血最快hcv8jop5ns2r.cn | 眼压低是什么原因hcv8jop2ns0r.cn | 风凉话是什么意思hcv9jop0ns5r.cn | 薷是什么意思hcv8jop1ns2r.cn |
紫河车是什么东西hcv8jop7ns3r.cn | 什么专业就业前景好hcv8jop6ns4r.cn | 甲沟炎有什么药hcv9jop5ns5r.cn | 布谷鸟叫有什么征兆hcv8jop0ns7r.cn | 什么那是什么吧hcv7jop6ns9r.cn |