0
3

【SwiftUI】CGAnimateImageDataWithBlockやCGAnimateImageAtURLWithBlockを使ってGIFを表示する

Last updated at Posted at 2024-02-08

はじめに

数日前に「【SwiftUI】GIFを表示したい」という記事を書きました。

コメント欄でもっといい表示方法を教わったので試してみました。

サンプルアプリ

Simulator Screen Recording - iPhone 15 - 2024-02-08 at 22.24.03.gif

今回使用するGIF

heart.gif

SuperGSATBによるPixabayのGIF

実装

struct GIFView: View {
    @State private var image: Image?
    var gifData: CFData?
    var gifURL: CFURL?
    
    init(asset: NSDataAsset) {
        self.gifData = asset.data as CFData
        self.gifURL = nil
    }
    
    init(url: URL) {
        self.gifData = nil
        self.gifURL = url as CFURL
    }
    
    var body: some View {
        Group {
            if let image {
                image
                    .resizable()
                    .scaledToFit()
            } else {
                Text("読み込み失敗")
            }
        }
        .onAppear {
            if let gifData {
                CGAnimateImageDataWithBlock(gifData, nil) { index, cgImage, stop in
                    self.image = Image(uiImage: .init(cgImage: cgImage))
                }
            }
            if let gifURL {
                CGAnimateImageAtURLWithBlock(gifURL, nil) { index, cgImage, stop in
                    self.image = Image(uiImage: .init(cgImage: cgImage))
                }
            }
        }
    }
}

GIFの読み込み

GIFの読み込み方が2種類あります。

パターン1

Assetsの中にGIFを追加する方法です。

スクリーンショット 2024-02-08 22.29.26.png

パターン2

プロジェクトのディレクトリ内に追加する方法です。
スクリーンショット 2024-02-08 22.30.11.png

スクリーンショット 2024-02-08 22.30.21.png

実装

import SwiftUI

struct ContentView: View {
    var body: some View {
        VStack {
            // パターン1
            GIFView(asset: NSDataAsset(name: "heart")!)
                .frame(width: 300, height: 300)
            
            // パターン2
            GIFView(url: Bundle.main.url(forResource: "heart", withExtension: "gif")!)
                .frame(width: 300, height: 300)
        }
    }
}

おわり

こんな機能があったなんて知りませんでした。
めっちゃ便利ですね!!

@Yajiro さんに感謝です!

参考記事

公式ドキュメント

0
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
3