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 (英文)
卡哇伊内是什么意思 | 月经第二天属于什么期 | 经常吐口水是什么原因 | 仙人跳什么意思 | 红茶适合什么季节喝 |
霉菌性阴道炎什么症状 | 杀了神经的牙为什么还疼 | 肝主什么 | 三个土字念什么字 | 梦见别人给自己剪头发是什么意思 |
术后病人吃什么营养恢复快 | 6.8是什么星座 | 甘心的近义词是什么 | 耳蜗是什么 | 总是睡不着觉是什么原因 |
肝五行属什么 | 血小板吃什么补得快点 | 苦不堪言是什么意思 | 合集是什么意思 | 跑步后头晕是什么原因 |
伤口用什么消毒hcv7jop7ns0r.cn | 上午九点到十一点是什么时辰hcv8jop7ns0r.cn | 帛书是什么意思hcv9jop0ns9r.cn | sey什么意思bysq.com | 十月初三是什么星座hcv9jop1ns6r.cn |
4月28日是什么星座hcv8jop1ns3r.cn | 病毒性扁桃体发炎吃什么药hcv8jop4ns6r.cn | 貂蝉姓什么hcv8jop6ns5r.cn | 丙球是什么hcv8jop1ns2r.cn | 1110是什么星座hcv9jop1ns2r.cn |
绿色属于五行属什么hcv8jop1ns3r.cn | 生孩子大出血是什么原因造成的hcv9jop5ns9r.cn | 梦到自己生病了什么意思hcv9jop6ns3r.cn | 新房送什么礼物好hcv8jop9ns8r.cn | 阿拉伯人是什么种人hcv8jop2ns6r.cn |
农历七月二十什么日子hcv8jop4ns1r.cn | 苟且是什么意思hcv9jop3ns8r.cn | 什么是甲状腺hcv8jop5ns6r.cn | 久坐伤什么hcv9jop4ns0r.cn | 牙龈流血是什么原因hcv9jop2ns6r.cn |