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

在LazyVStack中使用带有AsyncImage的VStack会导致图像在滚动时重新加载

LazyVStack是SwiftUI中的一个视图容器,它可以延迟加载其中的子视图,以提高性能和响应速度。AsyncImage是SwiftUI中的一个视图,用于异步加载和显示图像。

在LazyVStack中使用带有AsyncImage的VStack会导致图像在滚动时重新加载的原因是LazyVStack会根据需要加载和显示子视图,而AsyncImage是一个异步加载的视图,它会在需要显示时才开始加载图像。当滚动LazyVStack时,子视图会被重新加载,导致AsyncImage重新加载图像。

为了解决这个问题,可以使用Identifiable协议来标识每个AsyncImage,以便LazyVStack可以正确地重用已加载的图像。具体步骤如下:

  1. 创建一个遵循Identifiable协议的结构体或类,用于标识每个AsyncImage。例如:
代码语言:txt
复制
struct ImageItem: Identifiable {
    let id = UUID()
    let imageURL: URL
}
  1. 在LazyVStack中使用ForEach来遍历图像数据,并为每个AsyncImage提供唯一的标识符。例如:
代码语言:txt
复制
LazyVStack {
    ForEach(imageItems) { item in
        AsyncImage(url: item.imageURL) { image in
            image
                .resizable()
                .aspectRatio(contentMode: .fit)
        } placeholder: {
            // Placeholder view while loading
            ProgressView()
        }
        .id(item.id)
    }
}

在上述代码中,imageItems是一个包含图像数据的数组,每个图像数据都包含一个唯一的标识符和图像URL。通过为AsyncImage提供item.id作为标识符,LazyVStack可以正确地重用已加载的图像。

这样,当滚动LazyVStack时,图像将不会重新加载,而是被正确地重用,提高了性能和滚动的流畅性。

关于腾讯云相关产品和产品介绍链接地址,可以参考以下内容:

  • 腾讯云对象存储(COS):提供高可靠、低成本的云端存储服务,适用于存储和处理各种类型的媒体文件。详情请参考腾讯云对象存储(COS)
  • 腾讯云云服务器(CVM):提供可扩展的云端计算能力,适用于构建和部署各种类型的应用程序。详情请参考腾讯云云服务器(CVM)
  • 腾讯云人工智能(AI):提供丰富的人工智能服务和工具,包括图像识别、语音识别、自然语言处理等,可用于开发智能化的应用程序。详情请参考腾讯云人工智能(AI)

请注意,以上链接仅供参考,具体产品选择和使用需根据实际需求进行评估和决策。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

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

更复杂 UI ,由于视图更新速度过快,性能( 至少 macOS 上 )迅速下降。A:有不同策略。ObservableObject 是使视图或视图层次结构失效( 引发重新计算 )单元。...这意味着我们不能使用 LazyVStack,或任何其他将选择与详细视图绑定自定义视图。有扩展这个功能计划吗?A: iOS 16.1 ,你可以侧边栏里放一个。...然后用 SwiftUI Image 来加载,data 还挺大,当多个同时加载,会卡顿和内存占用,请问这种情况下怎么改善A:首先尽量保证采用异步加载方式加载和创建图片,比如 SwiftUI AsyncImage...这是一个多个版本中都出现过奇怪问题。 SwiftUI 早期版本,当在 iOS 中使用系统中文输入法,很容易触发这种情况。但后期逐步得到了修复。...但这个滚动有两大问题,1、是一个未公开半成品,有可能会被从 SwiftUI 框架移除;2、不支持懒加载,即使和 Lazy 视图一起使用一次性加载全部视图。

14.7K30

SwiftUI 视图生命周期研究

需要创建哪些实例,则是根据当时状态决定,每次状态变化都可能导致最终生成视图值树不同(可能仅是某个节点视图值发生变化,也可能是视图值树结构都发生了巨大变化)。...• SwiftUI 生成视图值树,当发现没有对应实例,SwiftUI 创建一个实例从而获取它 body 结果。...比如在 List 和 LazyVStack ,Cell 视图创建之后即使滚动出屏幕不参与布局与渲染,但 SwiftUI 仍会保留这些视图数据,直到 List 或 LazyVStack 被销毁。...List 或 LazyVStack ,Cell 视图进入屏幕后触发 onAppear,滚动出屏幕后会触发 onDisappear, Cell 视图存续期内可以多次触发 onAppear 和 onDisappear...在前文视图值树介绍我们提到,当 SwiftUI 重建该树,如果树上某个节点(视图) Source of truth 没有发生变化,将不重新计算,直接使用旧值。

4.3K30

深入了解 SwiftUI 5 ScrollView 新功能

之前 List 或 TextEditor 实现类似操作是十分困难。 默认 ContentMarginPlacement(.automatic)将导致指示器与内容之间长度不一致。...使用 scrollIndicatorsFlash(trigger:) 可以提供值更改时,修饰符作用域范围内所有可滚动容器滚动指示器短暂闪烁。...可采用 优化 SwiftUI List 显示大数据集响应效率[5] 一文中介绍方式来解决。 scrollPostion(id:) 使用此修饰符可以让滚动视图滚动到特定位置。...仅适用于 ScrollView 当 ForEach 数据源遵循 Identifiable 协议,无需显式使用 id 修饰符设置标识 与 scrollTargetLayout 配合使用,可以获取当前滚动位置...(视图标识) 不支持锚点设定,固定锚点为子视图 center 正如 优化 SwiftUI List 显示大数据集响应效率[6] 一文所提到,当数据集很大,也会出现性能问题。

67120

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

本文将介绍几种 SwiftUI 获取当前滚动状态方法,每种方法都有各自优势和局限性。...当没有事件,Runloop 进入休眠状态,而有事件,Runloop 会调用对应 Handler。Runloop 与线程是绑定。...绝大多数时间里,Runloop 都处于 kCFRunLoopDefaultMode( default )模式,当可滚动控件处于滚动状态,为了保证滚动效率,系统会将 Runloop 切换至 UITrackingRunLoopMode...iOS 系统 macOS 下 eventTracking 模式,该方案表现并不理想屏幕只能有一个可滚动控件由于任意可滚动控件滚动,都会导致主线程 Runloop 切换至 tracing...判断准确度没有前两种方式高当可滚动组件内容出现了非滚动引起尺寸或位置变化( 例如 List 某个视图尺寸发生了动态变化 ),本方式误判断为发生了滚动,但在视图变化结束后,状态马上恢复到滚动结束滚动开始后

3.7K40

视图 Body 中生存变量

View 协议,body 被属性包装器 @ViewBuilder 所标注,这意味着,通常我们只能在 body 中使用 ViewBuilder 认可 Expression 来声明视图( 如果显式使用...本例,渲染成我们看到首行数据之前, offset 已被调用过 14 次,与当前数据量( 13 )非常接近。FetchRequest 导致了上述重复调用。...image-20230321203001315 假如,我们将 VStack 换成 List 或 LazyVStack 呢?...这并不意味着我推荐本节介绍方法,日常使用,除非真的出现了不可调和性能问题,enumerated 仍是最符合直觉解决之道。...@State + onAppear 也能实现类似的效果,不过让视图多刷新一次。如果计算时间真的较长( 导致视图停滞 ),通过 task 中使用异步方法才是更好选择。

64910

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

不过仅有在前两列通过 List(selection:) 来修改状态,才能在自动转换 NavigationStack 表现形式具备程序化导航能力。方案一对此有进一步说明。...那么能否导航列中使用 VStackLazyVStack 实现程序化导航呢?... InterfaceSizeClass 发生改变后,需要对导航状态进行调整,以匹配 NavigationStack 需求。反之亦然。演示图片见本文第一个动。...以导航容器出现时机( onAppear )作为重新构建状态起始点sizeClass 变化过程,其中值可能会出现重复变化情况。...不要忘记 NavigationStack 根视图不在它“栈”数据本例,转换至 NavigationStack ,需要将 Detail 列声明视图添加到“栈”底端。反过来则将其移除。

4.2K30

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

也就是当显示主界面菜单,列表视图已经完成了实例创建(可以通过 ListEachRowHasID 构造函数添加打印命令得以证明),因此也不应是实例化列表视图导致延迟。...使用了 id 修饰符相当于将这些视图从 ForEach 拆分出来,因此丧失了优化条件。 总之,当前在数据量较大情况下,应避免 List 对 ForEach 子视图使用 id 修饰符。...新问题 细心朋友应该可以注意到,运行解决方案一代码后,第一次点击 bottom 按钮,大概率会出现延迟情况(并不会立即开始滚动)。...由于整个滚动过程仅实例化并绘制了 100 多个子视图,对系统压力并不大,因此经过反复测试后,首次点击 bottom 按钮延迟滚动问题大概率为当前 ScrollViewProxy Bug...生产中处理方式 本文为了演示 id 修饰符 ForEach 异常状况以及问题排查思路,创建了一个在生产环境几乎不可能使用范例。

9.1K20

Qml开发性能Tips(翻译文)

这样,大图像不会占用超过必要内存; 这对于从外部源加载或由用户提供内容尤为重要。 请注意,动态更改此属性导致重新加载图像源,甚至可能来自网络,如果它不在内存缓存。...图像在内部进行缓存和共享,因此如果多个图像元素使用相同源,则只加载图像一个内存。 1.5 仅在必要启用Imagesmooth属性 启用smooth属性对性能不利。...如果您确实需要启用Imagesmooth属性,请在动画开始禁用平滑处理,并在动画结束重新启用它(仅当图像在屏幕上静止,缩放瑕疵才可见)。...委托元素越少,视图滚动速度就越快; 列表委托,仅将QML用于用户界面,并使用C++实现其余部分(例如:数据生成,数据处理)。不要使用JavaScript。...如果整个应用程序一个代码量巨大QML文件实现,就会发生这种情况。明智地将应用程序划分为逻辑实体,开始加载最小QML,然后再使用加载器Loader根据需要加载更多QML。

4.8K32

避免 SwiftUI 视图重复计算

通过 _makeProperty 方法,SwiftUI 得以实现在将视图加载到视图树,把所需数据( 值、方法、引用等 )保存在 SwiftUI 托管数据池中,并在属性( AttributeGraph...@ObservedObject var store = Store() // 每次创建视图类型实例,都会重新创建 Store 实例 由于 SwiftUI 不定时地创建视图类型实例( 非加载视图 ),...of Truth( 符合 DynamicProperty 协议属性包装器 ),只要在视图类型声明了,无论是否视图 body 中被使用它给出刷新信号,当前视图都将被刷新。...这是因为,我们将 Student 类型作为参数传递给了子视图,SwiftUI 比对实例时候,并不会关心子视图中具体使用了 student 哪个属性,只要 student 发生了变化,那么就会重新计算...因此,为了减少因事件源导致重复计算,我们可以考虑采用如下优化思路: 控制生命周期 只需要处理事件加载与其关联视图,用关联视图存续期来控制触发器生命周期 减小影响范围 为触发器创建单独视图

9.2K81

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

这两个错误包括:通过手势取消 Sheet 后,快速右滑导航容器导致应用锁死;以及滚动返回上层视图导致应用崩溃。...原文发表博客 肘子Swift记事本视图变化在前、状态变化在后 SwiftUI ,某些可编程控件执行一定操作先更新视图,待视图变化完成后再修改与其对应状态。...通过手势取消 Sheet 后,快速右滑导航容器导致应用锁死这是一个 SwiftUI 所有版本存在错误,你可以众多论坛或聊天室里看到不少开发者都在寻找解决方法。...当视图正在滚动返回上一层视图导致应用崩溃这是一个由 xiaogd Discord 论坛中提出 问题。...由于返回上层视图,状态尚未更新,因此清理 AG (返回动画运行),破坏应用程序 AttributeGraph 完整性,从而导致应用程序死锁或崩溃。

587110

如何深入理解 JavaScript 加载

本文将向您展示如何使用加载,以便您用户访问您网站获得更好体验。 介绍 网络用户对网站加载时间和性能有很高期望。加载缓慢网站可能增加跳出率并让用户感到不满意。...然而,两种广泛使用技术是使用Intersection Observer API来延迟加载图像,以及滚动事件实现内容延迟加载。...带有交互元素和小部件(如滑块、轮播和手风琴)页面也可以利用延迟加载。跨多个页面的长文章或博客文章也可以从延迟加载受益。...管理多个延迟加载元素,确保它们正确时间加载,并处理交互可能具有挑战性。 管理图像尺寸:响应式设计,懒加载像在处理不同屏幕尺寸和分辨率可能变得具有挑战性。...这意味着您可以更快地看到页面并使用更少数据。JavaScript实现懒加载,浏览器兼容性是另一个需要考虑因素。

29230

UITableView性能提升和优化(第

重用图片 显示图片主要问题在于加载时间,要么通过文件系统IO,要么通过网络IO,都是非常耗时。这个加载过程同样影响到滚动性能,当iOS不能返回cell来渲染UI。...使用这个技术,你可以把耗时处理任务放到当前线程之外。我的当前例子,不会使用多线程,因为你必须立即了解很多新概念。本章结束时候,你应该自己做完这个练习。...这是NSDictionary缓存图片主要代码(请不要使用这种方式存储图片,因为它会导致内存警告)。...表格 3-4 重用图片之后测试结果 好极了!fps现在几乎是60了,预加载时间也降低了。如果你apps能够达到这个水平,你不必再担心滚动性能了;它非常流畅。...当要获取图片或数据时候,你可以使用多线程,然后稍后进行填充。从用户角度来看,这种方法将会使得滚动更加流程,加载图片速度更快。

64820

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

这两个错误包括:通过手势取消 Sheet 后,快速右滑导航容器导致应用锁死;以及滚动返回上层视图导致应用崩溃。...视图变化在前、状态变化在后 SwiftUI ,某些可编程控件执行一定操作先更新视图,待视图变化完成后再修改与其对应状态。这些控件基本上都是对 UIkit(AppKit)二次包装。...通过手势取消 Sheet 后,快速右滑导航容器导致应用锁死 这是一个 SwiftUI 所有版本存在错误,你可以众多论坛或聊天室里看到不少开发者都在寻找解决方法。...当视图正在滚动返回上一层视图导致应用崩溃 这是一个由 xiaogd Discord 论坛中提出 问题[3]。...由于返回上层视图,状态尚未更新,因此清理 AG (返回动画运行),破坏应用程序 AttributeGraph 完整性,从而导致应用程序死锁或崩溃。

26520

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

正常情况下( 惰性容器仅包含一个 ForEach ,且子视图没有使用 id 添加显式标识 ),惰性容器仅创建当前可见范围内子视图实例,并对其 body 进行求值( 渲染 )。...Instruments 导致优化后结果显示不准确,内存占用数据将以 App 显示以及 Xcode Navigator Debug 栏内容为准。如果滚动过快,可能导致内存占用增大。...本例,只有视图首次出现在 List 可视区域,Item 才会被填充数据。 托管对象从惰值状态( Fault )脱离后,只有几种特定条件下,才会重新转换为惰值。...如果我们能够视图离开可视区域,能让托管对象重新进入惰值状态,或许又能节省一部分内存。...不过通过实验中分析,这些数据肯定是被缓存,且在被加载后,并不会因为返回惰值而自动从内存清除 因此,即使我们将托管对象返回成惰值状态,也仅能节省极少内存占用( 本例几乎可以忽略不计 )。

1.2K10

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

正常情况下( 惰性容器仅包含一个 ForEach ,且子视图没有使用 id 添加显式标识 ),惰性容器仅创建当前可见范围内子视图实例,并对其 body 进行求值( 渲染 )。...图片 Instruments 导致优化后结果显示不准确,内存占用数据将以 App 显示以及 Xcode Navigator Debug 栏内容为准。如果滚动过快,可能导致内存占用增大。...本例,只有视图首次出现在 List 可视区域,Item 才会被填充数据。 托管对象从惰值状态( Fault )脱离后,只有几种特定条件下,才会重新转换为惰值。...如果我们能够视图离开可视区域,能让托管对象重新进入惰值状态,或许又能节省一部分内存。...不过通过实验中分析,这些数据肯定是被缓存,且在被加载后,并不会因为返回惰值而自动从内存清除 因此,即使我们将托管对象返回成惰值状态,也仅能节省极少内存占用( 本例几乎可以忽略不计 )。

2.4K40

SwiftUI 布局协议 - Part 1

这类型常常被作为视图容器,虽然布局协议是今年新推出(至少公开来说),但是我们第一天使用 SwiftUI 时候就在使用了,当每次使用 HStack 或者 VStack 放置视图都是如此。...请注意至少到现在,布局协议不能创建懒加载容器,比如 LazyHStack 或 LazyVStack。懒加载容器是指那些只滚入屏幕渲染,滚出到屏幕外就停止渲染视图。...例如,可能根据提供尺寸截取文本,或者提供宽度内垂直展示文本,如果你使用 fixedSize 修改甚至可能超出屏幕就像例子图片一样。...无论如何,没有缓存情况下编写我们布局更简单一点,当我们以后需要再添加。SwiftUI 已经做了一些缓存。例如,从子视图代理获得自动存储缓存。相同参数反复调用将会使用缓存结果。...当我们使用一个类型实例,这些方法会像一个函数一样被调用。在这种情况下,我们可能感到困惑,因为我们似乎只是初始化类型,而实际上,我们做更多。

3.2K10

Android Compose 新闻App(八)抽屉布局、动态权限、拍照返回

,那么是加载不了,我们可以这样修改一下AsyncImage,代码如下: AsyncImage( model = ImageRequest.Builder...,通过ImageRequest去设置要加载图片,并设置加载失败时候图片,这个图片去我源码获取,然后这里还有一个placeholder,这个意思就是预览,当加载网络图片时一开始没加载出来就显示此图片...,一般来说作为动态权限,我们需要在使用时候再请求,而不是一打开App就请求,而我们现在App中有一个抽屉布局,里面有一个头像,我们可以点击这个头像时候请求动态权限,通过权限后我们提示一下,再次点击...还记得之前AndroidActivityResult API吗?...① ActivityResult API 这个ActivityResult API里面携带了很多常用页面处理,包括了进入系统相机,下面我们将使用它,使用之前,我们DrawerView函数创建两个变量

2K20

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

这意味着,即使我们定义视图结构体声明了使用 @State 标注变量,但只要 body 没有使用该属性( 通过 ViewBuilder 支持语法 ),即使该属性发生变化,视图也不会刷新。...Sheet( FullScreenCover )视图生命周期或许有人问, sheet 代码,Text 同样包含了对 n 引用。...即使为新上下文中视图进行关联操作是视图求值操作之前完成,但由于 n 变化与关联操作被集中一个 Render Loop ,这样导致关联之后并不会强制新关联视图刷新( 关联后,值并没有发生变化...State 声明,但 show 变化并不会导致 ContextView 重新更新。...事实上,使用 @StateObject 相当于 vm.n 发生变化后,强制视图重新计算。

1.9K20

如何在 SwiftUI 创建条形

系列文章 如何在 SwiftUI 创建条形 SwiftUI 水平条形 iOS 16 中用 SwiftUI Charts 创建一个折线图 iOS16 中用 SwiftUI 图表定制一个线图... Swift 图表中使用 Foudation 库测量类型 开始图表布局 SwiftUI 对探索不同布局和预览实时视图结果是很友好。...} } Text(name) } .padding(.horizontal, 4) } } 屏幕旋转 条形使用样本数据看起来不错...图标被设置为固定大小,视图被嵌入到 ScrollView ,以便在设备旋转滚动。...SwiftUI 是一个很好平台,用于创建视图和快速重构独立子视图。 SwiftUI 构建条形需要做一些工作,随着使用数据来试用条形,可以确定更多定制化。

5.1K10

基于iframe移动端嵌套

问题 考虑再三后最省时间成本就是使用iframe,虽然移动端使用,我内心是很拒绝,不过其他方案调研了下都不太符合现状。...外部页面使用width=device-width,而引用其中一个页面的width=640,这导致那个页面渲染时候无法全屏缩小 3.ios下其中一个页面莫名其妙扩大 4.iframe页面a...: scroll;"> 并且禁止浏览器默认行为,不然类似于微信滑动到底部时候和回弹效果进行冲突 $('body').on('touchmove...5.iframe页面切换时候,切换后页面样式莫名变大 之前我做页面切换,是用过不重新加载iframe,而是直接修改了iframeurl,但是好像在这种情况下,可能之前上一个页面加载css没有完全清除掉...6.页面点击跳转之后,返回状态标记 使用了localStorage记录了url,navIndex 7.某个安卓机后返回无法重新加载iframe 返回后再appendiframe代码下再让其重新渲染下

3.6K60
领券