SwiftUIでURLから画像を取得して表示する方法を紹介します。
指定されたURLから画像をダウンロードする ImageLoader
と、その画像を表示する URLImage
を作成すると表示することができます。
まず画像をダウンロードする ImageLoader
です。
class ImageLoader: ObservableObject {
let objectWillChange = ObservableObjectPublisher()
var image: Image? {
willSet {
objectWillChange.send()
}
}
func load(url: String) {
guard let url = URL(string: url) else { return }
URLSession.shared.dataTask(with: url) { data, response, error in
guard let data = data, let image = UIImage(data: data) else { return }
DispatchQueue.main.async {
self.image = Image(uiImage: image)
}
}.resume()
}
}
ObservableObject
にして、image
の変更を監視できるようにします。load
関数で指定されたURLから画像をダウンロードしてImage
をセットします。
次に画像を表示するView URLImage
です。
struct URLImage<Content>: View where Content: View {
@ObservedObject var imageLoader = ImageLoader()
private let url: String
private let content: (_ image: Image) -> Content
init(url: String, content: @escaping (_ image: Image) -> Content) {
self.url = url
self.content = content
}
var body: some View {
ZStack {
if imageLoader.image != nil {
content(imageLoader.image!)
} else {
content(Image("placeholder"))
}
}.onAppear {
self.imageLoader.load(url: self.url)
}
}
}
struct URLImage_Previews: PreviewProvider {
static var previews: some View {
URLImage(url: "") {
$0
}
}
}
urlを受け取りonAppear
でImageLoader
のload
を呼び出します。ここではダウンロードする前でimage
がnil
の時はplaceholder
画像を表示するようにしています。
またcontent
を受け取ることで、URLImage
を呼び出した側から画像のスタイルを変更できるようにできます。
URLImage
の使い方です。例えば、画像を丸い円でクリップして影をつけてみます。
URLImage(url: url) {
$0.renderingMode(.original)
.resizable()
.scaledToFit()
.clipShape(Circle())
.frame(width: 50.0, height: 50.0)
.overlay(Circle().stroke(Color.white,lineWidth:4).shadow(radius: 10))
}
より使いやすいAPIを提供してくれているOSSもすでにGitHubに公開されています。
エンジニアリング SwiftUI 画像
関連記事
-
2025/3/28
Macのストレージに空き容量があるのに、実際には空き容量がない状態になっているとき
Mac Storage
-
2024/3/24
try! Swift Tokyo 2024
try! Swift Tokyo 2024の参加メモ
Swift
-
2023/1/31
SwiftUIでTabBarを非表示にする
SwiftUI TabBar
-
2023/1/14
Bootstrap5.3で追加されたダークモードに対応してみました
Bootstrap DarkMode
-
2021/2/17
brew upgradeで Your CLT does not support macOS 11というエラーがでた
homebrew macOS Big Sur
-
2020/12/1
Apple Silicon搭載 MacBook Pro M1で Homebrewとrbenvをインストールする
先日購入したApple Silicon搭載 MacBook Pro M1にこのブログをビルドするためにHomebrewとrbenvをインストールしたのでメモ。
Apple Silicon Homebrew rbenv
-
2020/11/27
Apple Silicon搭載のMacBook Pro M1が危うく文鎮化するところだったので記録
Apple Silicon搭載のMacBook Pro 13インチを仕事用に購入したのですが、クリーンインストールしたところ文鎮化しかけたので記録しておきます。
MacBook Pro Apple Apple Silicon M1
-
2020/6/23
Platform State of the Unionまとめ
Platform State of the Unioまとめ
WWDC2020 Apple アップル iOS macOS watchOS tvOS
-
2020/6/23
WWDC2020キーノートまとめ
WWDC2020 キーノートまとめ
WWDC2020 Apple アップル iOS macOS watchOS tvOS
-
2020/5/31
GitHub Pagesで無料ブログを作成する - Part4 自分のオリジナルのテーマを作る
Jekyllでは既存のテーマを使うこともできるのですが、さらに一歩踏み込んで、自分で既存のテーマをカスタマイズしたり、テーマを作ることもできます。
GitHub Pages ブログ