首页
学习
活动
专区
工具
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)

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

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

相关·内容

SwiftUI 掌握 ScrollView 使用滚动可见性

前言我们滚动 API 又有一个重要新增功能:滚动可见性。现在,你可以获取可见标识符列表,或者快速检查并监控 ScrollView 内视图可见性状态。...它设计得易于使用,允许你将其附加到具有滚动目标布局任何 ScrollView 上。让我们通过一个示例来探讨这个修饰符使用。...同样,当视图从可见状态转换为不可见状态,即显示视口部分少于 10% ,也运行该闭包。...运行这个 Demo,你会看到一个带有多个文本视图 ScrollView,当你滚动,控制台会打印当前可见项。...此外,页面底部有一个视频播放器,当视频播放器出现在视口内,它会自动播放,当其离开视口自动暂停。总结今天,我们学习了如何跟踪 ScrollView 内特定视图可见性,并监控可见标识符列表。

17121

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.8K30
  • SwiftUI 视图生命周期研究

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

    4.4K30

    深入了解 SwiftUI 5 ScrollView 新功能

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

    83420

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

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

    3.8K40

    视图 Body 中生存变量

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

    68810

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

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

    4.3K30

    SwiftUI 新容器视图 API 深度解析:轻松构建自定义布局

    通过 Card 容器视图内嵌入不同视图,你可以应用多个屏幕复用它。这是使用容器视图主要优势之一:你可以通过将共享功能封装在容器视图中,应用不同地方重复使用它们。...SwiftUI 引入了新 API,允许我们重新组合视图。例如,我们可以从通过 @ViewBuilder 闭包构建内容视图中提取子视图,并根据需要将它们放置。...我们使用带有 subviews 参数 Group 视图,它允许我们将子视图提取到一个名为 SubviewsCollection 集合类型。...return length / 3 } } // 其余子视图为横向滚动...你可以应用多个地方使用该容器来保持一致样式。Carousel:一个横向滚动容器视图,可以自动排列并展示内容,适合展示横向滑动图像或视图。

    13011

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

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

    9.2K20

    Qml开发性能Tips(翻译文)

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

    4.9K32

    避免 SwiftUI 视图重复计算

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

    9.3K81

    SwiftUI WWDC 24 之后新变化

    标签栏体验使用 Tab 类型,SwiftUI 提供了新可定制标签栏体验,带有流畅过渡到侧边栏。...NavigationStack 内从一个视图导航到另一个视图使用相同标识符和命名空间创建平滑过渡。...滚动位置新 ScrollPosition 类型与 scrollPosition 视图修饰符配对,允许我们读取 ScrollView 实例精确位置。我们还可以使用它编程地滚动滚动内容特定点。...extension EnvironmentValues { @Entry var itemsPerPage: Int = 10}预览新 Previewable 宏允许我们预览引入状态,而无需将其包装到额外包装视图中...API,如窗口推送、TextField 和 TextEditor 视图中文本选择观察、搜索焦点监控、自定义文本渲染、新 MeshGradient 类型等等,我无法一篇文章涵盖所有内容。

    12910

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

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

    707110

    如何深入理解 JavaScript 加载

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

    35030

    UITableView性能提升和优化(第

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

    67420

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

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

    34620

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

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

    1.3K10

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

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

    2.4K40

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

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

    2.2K20
    领券