如何让加载失败的Kingfisher KFImage自动折叠?
优化KFImage加载失败自动折叠的方案
你原来的方案逻辑可行,但可以通过补充回调逻辑或调整渲染方式来简化代码,以下两种更简洁的实现方式:
方案一:优化状态控制逻辑
补充失败回调确保URL无效时能正确折叠,同时配合隐藏修饰符彻底清理布局占位:
@State private var shouldShowImage = false HStack(alignment: .top) { KFImage(someUrl) .onSuccess { _ in shouldShowImage = true } .onFailure { _ in shouldShowImage = false } .forceRefresh() .resizable() .aspectRatio(contentMode: .fill) .cornerRadius(20) .clipped() .frame(width: shouldShowImage ? 150 : 0) .hidden(!shouldShowImage) Text("some Text") }
- 补充
onFailure回调,覆盖URL无效、加载失败等所有异常场景 .hidden(!shouldShowImage)配合width:0,彻底避免组件在隐藏时仍占用布局空间
方案二:条件渲染图片组件
提前预加载图片,仅在加载成功后才将KFImage加入布局,失败时完全不渲染组件:
@State private var imageLoaded = false HStack(alignment: .top) { if imageLoaded { KFImage(someUrl) .resizable() .aspectRatio(contentMode: .fill) .cornerRadius(20) .frame(width: 150) .clipped() } Text("some Text") } .onAppear { KingfisherManager.shared.retrieveImage(with: someUrl) { result in imageLoaded = result.isSuccess } }
- 用
KingfisherManager提前校验图片可用性,逻辑更直观 - 失败时组件不会出现在布局树中,完全不占用空间,布局更干净
内容的提问来源于stack exchange,提问作者tscheppe
相关产品推荐
相关产品推荐

