画像の遅延Load
AsyncImage
で これだけ・・
swift
AsyncImage(url: url) { image in
image
.resizable()
.scaledToFit()
} placeholder: {
ProgressView()
.frame(width: 200, height: 200)
}
.id(url) // ← ただし、これをつけないと、1個前の画像が残るので
エラー時の画面も用意したい場合はこう
( = placeholder:
なし )
swift
CachedAsyncImage(url: url) { phase in
if let image = phase.image {
image
.resizable()
.scaledToFit()
.padding(0)
} else if phase.error != nil {
ZStack {
Colors.systemGray5
Image(systemName: "figure.fall")
.foregroundColor(.gray)
}
} else {
ZStack {
Color.clear
ProgressView()
}
}
}
.id(url)
結果をキャッシュしたい場合は
CachedAsyncImage
を使用
CachedAsyncImage
は AsyncImage
をそのまま置き換えるだけで良いが、
さらにキャッシュを使いたい場合は下記のようにできるそうなのだが、★ の行がコンパイル通らない。
あとでもうちょい簡単なコードで試す
swift
if let url = URL(string: imageURL) {
let req = URLRequest(url: url)
CachedAsyncImage(urlRequest: req, urlCache: .imageCache) { phase in
}
...
extension URLCache {
static let imageCache = URLCache(memoryCapacity: 512_000_000, diskCapacity: 10_000_000_000)
}
このひとのライブラリは Map Item Picker も使ってみようかな