質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%

Q&A

解決済

1回答

1961閲覧

【SwiftUI】ボタンを押す度、Gifを1ループ分だけ表示させる

Jene

総合スコア13

0グッド

0クリップ

投稿2022/01/18 12:06

前提・実現したいこと

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向け

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hoshi-takanori

2022/01/18 19:40 編集

SwiftyGif を (SwiftUI ではなく UIKit で) 試してみましたが、そもそも startAnimatingGif や stopAnimatingGif が期待通りに動かない気がします。代わりに loopCount に 1 とか 0 とか入れたら動きましたが、そういうもの?
Jene

2022/01/19 14:28

loopCountを指定せずに定義したということでしょうか? それともstartAnimatingGifやstopAnimatingGifの代わりにloopCountを使って直接Gifを再生したということでしょうか?理解不足で申し訳ございません。
hoshi-takanori

2022/01/19 18:31

試しに書いたコードはこんなのです。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() } }
Jene

2022/01/22 09:26

ご確認頂いた内容で動作確認したところ無事動きました。 ご丁寧にありがとうございました。
guest

回答1

0

自己解決

ライブラリに入っていた関数が期待通りの動作しなかったことが原因でした。

投稿2022/01/22 09:27

Jene

総合スコア13

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問