前提・実現したいこと
SwiftUIでGifを1ループ分だけ表示させようと考えております。
調べたところSwiftyGifというライブラリを使うことで簡単に実装出来そうなことはわかっております。
発生している問題・エラーメッセージ
実際にライブラリを読み込んでGifを1ループ分だけ表示させることは出来たのですが、複数回連続で表示させることができません。
具体的に申し上げますと、アプリ起動直後の初回はボタンを押すと動くのですが、2回目以降はボタンを押しても止まったままの状態になっております。
該当のソースコード
GifView.swift
1class Trriger: ObservableObject { 2 //Gifの再生トリガーを定義 3 @Published var gifshow:Bool = false 4} 5 6struct SwiftyGif: UIViewRepresentable { 7 @ObservedObject var trigger: Trriger 8 9 func makeUIView(context: Context) -> UIImageView { 10 //Gifファイルを指定 11 let gif = try! UIImage(gifName: "ezgif.com-gif-maker") 12 //Gifの再生回数を指定(今回は一回) 13 let imageview = UIImageView(gifImage: gif, loopCount: 1) 14 return imageview 15 } 16 17 func updateUIView(_ gifImageView: UIImageView, context: Context) { 18 if trigger.gifshow == true { 19 //トリガーがtrueになったらGifを再生 20 gifImageView.startAnimatingGif() 21 } else { 22 //トリガーがfalseの際は停止 23 //1ループしたら停止 24 gifImageView.stopAnimatingGif() 25 } 26 } 27}
ContentView.swift
1struct ContentView: View { 2 @ObservedObject var trriger = Trriger() 3 var body: some View { 4 VStack{ 5 SwiftyGif(trriger: trriger) 6 .frame(width: 200, height: 200) 7 Button(action: { 8 //トリガーをtrueに変更 9 trriger.gifshow = true 10 }){ 11 Text("表示開始") 12 } 13 } 14 } 15}
試したこと
Gifが再生した後にトリガーをfalseにすればいいと思い、
gifImageView.startAnimatingGif()の後にtrriger.gifshow = falseの処理を入れましたが、動作しませんでした。恐らく私自身がUIViewRepresentableについての理解が足りていないことも原因だと思われます。
知見のある方ご教授頂けますと幸いです。よろしくお願い致します。
補足情報(FW/ツールのバージョンなど)
Xcode 13.2.1
iOS 15.0向け
SwiftyGif を (SwiftUI ではなく UIKit で) 試してみましたが、そもそも startAnimatingGif や stopAnimatingGif が期待通りに動かない気がします。代わりに loopCount に 1 とか 0 とか入れたら動きましたが、そういうもの?
loopCountを指定せずに定義したということでしょうか?
それともstartAnimatingGifやstopAnimatingGifの代わりにloopCountを使って直接Gifを再生したということでしょうか?理解不足で申し訳ございません。
試しに書いたコードはこんなのです。loopCount に 1 を入れると自動的にアニメーションが開始されて、0 を入れると止まるようです。
import UIKit
import SwiftyGif
class ViewController: UIViewController {
@IBOutlet weak var imageView: UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
let gif = try! UIImage(gifName: "5.gif")
imageView.setGifImage(gif, loopCount: 0)
}
@IBAction func startGif() {
imageView.loopCount = 1
//imageView.startAnimatingGif()
}
@IBAction func stopGif() {
imageView.loopCount = 0
//imageView.stopAnimatingGif()
}
}
ご確認頂いた内容で動作確認したところ無事動きました。
ご丁寧にありがとうございました。
回答1件
あなたの回答
tips
プレビュー