Skip to main content

画像の遅延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 を使用

lorenzofiamingo/swiftui-cached-async-image: CachedAsyncImage is the simplest way to add cache to your AsyncImage.

CachedAsyncImageAsyncImage をそのまま置き換えるだけで良いが、 さらにキャッシュを使いたい場合は下記のようにできるそうなのだが、★ の行がコンパイル通らない。 あとでもうちょい簡単なコードで試す

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 も使ってみようかな

lorenzofiamingo/swiftui-map-item-picker