You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iOS 16中List内的AsyncImage显示异常问题咨询

问题描述

以下代码在Xcode 14.1、iOS 16.1模拟器中运行时,滚动List组件时AsyncImage偶尔无法显示已下载的图片,取而代之的是灰色矩形:

struct Item: Identifiable {
    let id: String
    let url = URL(string: "https://styles.redditmedia.com/t5_j6lc8/styles/communityIcon_9uopq0bazux01.jpg")!
}

struct Content: View {

    let model: [Item] = {
        var model = [Item]()
        for i in 0 ..< 100 {
            model.append(.init(id: String(i)))
        }
        return model
    }()

    var body: some View {
        List(model) { item in
            Row(item: item)
        }
    }

}

struct Row: View {

    let item: Item

    var body: some View {
        AsyncImage(url: item.url)
    }

}
原因与解决方案

这是iOS 16.1和Xcode 14.1中的已知系统Bug,并非代码实现遗漏。该问题源于List的单元格复用机制与AsyncImage的缓存、渲染逻辑存在冲突,快速滚动时易出现加载状态异常。

可通过以下方式缓解或解决:

  • 指定AsyncImage固定尺寸:给AsyncImage添加frame或结合resizable设置尺寸限制,让List能明确单元格布局,减少复用阶段的渲染异常:
    AsyncImage(url: item.url) { image in
        image.resizable()
            .scaledToFit()
    } placeholder: {
        Color.gray
    }
    .frame(width: 50, height: 50)
    
  • 强制优先读取缓存:设置缓存策略为.returnCacheDataElseLoad,确保已下载的图片优先从缓存读取,避免重复请求或渲染异常:
    AsyncImage(url: item.url, cachePolicy: .returnCacheDataElseLoad) { image in
        image.resizable().scaledToFit()
    } placeholder: {
        Color.gray
    }
    .frame(width: 50, height: 50)
    
  • 升级系统版本:iOS 16.2及后续版本已修复该AsyncImage与List滚动相关的渲染问题,升级后可直接解决。

内容的提问来源于stack exchange,提问作者klememi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 14:01:13