在SwiftUI中,有一些.init
方法可以创建Image,但它们都不允许从网络/缓存加载UIImage的块或任何其他方式。
我使用Kingfisher从网络加载图像并缓存在列表行中,但在视图中绘制图像的方法是重新渲染它,我不希望这样做。此外,我在获取图像时创建了一个假图像(仅彩色)作为占位符。另一种方法是将所有内容 Package 在自定义视图中,只重新渲染 Package 器。但我还没有尝试过。
这个例子是工作的权利现在。任何想法,以改善目前的一个将是伟大的
使用加载器的一些视图
struct SampleView : View {
@ObjectBinding let imageLoader: ImageLoader
init(imageLoader: ImageLoader) {
self.imageLoader = imageLoader
}
var body: some View {
Image(uiImage: imageLoader.image(for: "https://url-for-image"))
.frame(width: 128, height: 128)
.aspectRatio(contentMode: ContentMode.fit)
}
}
个字符
7条答案
按热度按时间nfeuvbwi1#
SwiftUI 3
从iOS 15开始,我们现在可以使用
AsyncImage
:字符串
SwiftUI 2
这里是一个原生的SwiftUI解决方案,支持缓存和多种加载状态:
的数据
(The上面的代码没有使用任何第三方库,所以很容易以任何方式更改
NetworkImage
。Demo
的数据
型
(我使用了一个非常大的Stack Overflow徽标来显示加载状态。
uemypmqf2#
将Model传递给包含url的ImageRow结构。
字符串
y1aodyip3#
在SwiftUI中加载图像的一种更简单、更干净的方法是使用著名的Kingfisher库。
1.通过Swift Package Manager添加
Kingfisher
选择File > Swift Packages > Add Package Dependent。输入https://github.com/onevcat/Kingfisher.git
在“选择包存储库”对话框中。在下一页中,指定版本解析规则为“Up to Next Major”,最早版本为“5.8.0”。
在Xcode checkout 源代码并解析版本之后,您可以选择“Kingdom SwiftUI”库并将其添加到您的应用目标。
import KingfisherSwiftUI
的KFImage(myUrl)
个就这么简单
byqmnocz4#
我会使用
onAppear
回调函数字符串
wbrvyc0a5#
将
imageLoader
定义为@ObjectBinding
:字符串
使用图像的url初始化视图会更有意义:
型
举例来说,您可以:
型
lqfhib0f6#
字符串
像这样使用:
型
qmelpv7a7#
随着iOS 15和macOS 12在2021年的发布,SwiftUI提供了原生
AsyncImage
视图,可以异步加载图像。请记住,您仍然需要回退到早期OS版本的自定义实现。字符串
API本身还提供了各种方式来自定义图像或提供占位符,例如:
型
更多关于Apple Developer Documentation.