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

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

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

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

Q&A

解決済

1回答

2855閲覧

【swift】NSTimerを使って2枚の画像を交互に連続して出したい

nyancoro

総合スコア75

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

0グッド

1クリップ

投稿2016/03/31 09:57

swiftを勉強中の者です。

表題の通り、NSTimerを使って2枚の画像を交互に連続して出したいと思っています。
しかし自分で実装してみると、一番初めの画像切替の動きだけが滑らかでなく、セットした時間より短い時間で動作しているように見受けられます。

なぜこうなってしまうのか、またどうしたら狙い通りの動きになるのか、
お分かりの方がいらっしゃいましたらご教授頂けると幸いですm(__)m

以下がタイマー部分のコードになります。
(_imageにはもとから"banana"を表示させています。)

swift

1 2@IBOutlet weak var _image: UIImageView! 3private var timerOfChangeImages : NSTimer! 4 5private func TimerChangeImages() { 6 // タイマー開始 7 timerOfChangeImages = NSTimer.scheduledTimerWithTimeInterval(0.2, 8 target: self, 9 selector: "Selector", 10 userInfo: nil, 11 repeats: true) 12 } 13 14 func Selector() { 15 if _image.image == UIImage(named: "apple") { 16 _image.image = UIImage(named: "banana") 17 return 18 } 19 _image.image = UIImage(named: "apple") 20 }

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

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

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

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

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

guest

回答1

0

ベストアンサー

上記のコードを使用してメソッドの呼ばれる時間を出力してみました。
何度か確認しましたが、確かに1回目だけ1.91秒(若干の誤差あり)と少し短い間隔になっていますが
目に見えて短い感じでもありませんでした。

他にメソッドを呼び出すところ等情報がありましたら、記載願います。

2016/03/31 23:12:07.036
2016/03/31 23:12:07.227
2016/03/31 23:12:07.427
2016/03/31 23:12:07.627
2016/03/31 23:12:07.827
2016/03/31 23:12:08.027
2016/03/31 23:12:08.227
2016/03/31 23:12:08.426

swift

1private func TimerChangeImages() { 2 // タイマー開始 3 timerOfChangeImages = NSTimer.scheduledTimerWithTimeInterval(0.2, 4 target: self, 5 selector:"Selector", 6 userInfo: nil, 7 repeats: true) 8} 9 10// 時間出力用メソッド 11func nowTime() -> String { 12 let format = NSDateFormatter() 13 format.dateFormat = "yyyy/MM/dd HH:mm:ss.SSS" 14 return format.stringFromDate(NSDate()) 15} 16 17func Selector() { 18 19 print(nowTime()) 20 21 if _image.image == UIImage(named: "apple") { 22 _image.image = UIImage(named: "banana") 23 return 24 } 25 _image.image = UIImage(named: "apple") 26}

Timerを使用することにこだわっていないのであれば以下の方法でも同じことができます、お試しください。

swift

1override func viewDidAppear(animated: Bool) { 2 super.viewDidAppear(animated) 3 4 let imageList: [UIImage] = [UIImage(named: "apple")!,UIImage(named: "banana")!] 5 _image.animationImages = imageList 6 _image.animationDuration = 0.2 7 _image.startAnimating() 8} 9 10@IBAction func stopAnimation(sender: UIButton) { 11 _image.stopAnimating() 12}

投稿2016/03/31 14:22

編集2016/03/31 15:32
_Kentarou

総合スコア8490

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

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

nyancoro

2016/03/31 14:53

ありがとうございます! viewDidAppear内で呼び出していますが、初めだけ切り替わりのタイミングがおかしいです。 やって頂いた出力から考えるに、 メソッドの呼ばれるタイミングは正常だが、UIImageViewに表示されるタイミングが遅いということでしょうか?
_Kentarou

2016/03/31 15:11

メソッドを呼ぶタイミングはviewDidAppear内で問題ないと思います。こちらでは実機で確認しても問題なく切り替わっています。 質問では → セットした時間より短い時間で動作しているように見受けられます。とのことですが、先ほどのコメントでは → UIImageViewに表示されるタイミングが遅いということでしょうか? との事ですが、表示されるのが遅いのでしょうか、早いのでしょうか? ちなみにメソッドはメインスレッドでメソッドは実行されているという認識で大丈夫でしょうか?
_Kentarou

2016/03/31 15:33

別の方法も追記しました。
nyancoro

2016/03/31 16:03

説明が下手で申し訳ありません。 一枚目だけ表示されている時間が短い、ということです。 【メソッドが呼ばれる→UIImageViewに新しいimageが表示される】 という流れだと思うのですが、UIImageViewにimageがセットされるまでにタイムラグがあるのかな?と思った次第です。 メインスレッドです。 新しいプロジェクトを作って実行してもやはり1枚目の表示時間だけが短く感じられます。
_Kentarou

2016/03/31 16:34

表示時間を2秒とか長くしても最初だけ短く表示されますか? タイマーが何かの影響を受けているかもしれないので生成した直ぐ後に以下の1行を加えて試してもらいたいです。 NSRunLoop.currentRunLoop().addTimer(timerOfChangeImages, forMode: NSRunLoopCommonModes)
nyancoro

2016/03/31 16:48

頂いたanimationImagesを使ったコードで解決しました。 ありがとうございました!
_Kentarou

2016/03/31 16:56

原因分からずで申し訳ないです、、、とりあえず代用コードでやりたい事ができたようで良かったです。
nyancoro

2016/03/31 16:56

>表示時間を2秒とか長くしても最初だけ短く表示されますか? 2秒に設定した場合は特に短くは感じませんでした。 0.2秒などと短く設定するのはよくないのでしょうか? また0.2秒に設定した状態でNSRunLoop.currentRunLoop().addTimerを実行しても変化は見られず、やはり短く感じられました。(未熟なのでこのコードが何を意味するのか理解が及びませんが...)
_Kentarou

2016/03/31 17:03

単純にNSTimerを実行中にテーブルViewなどをスクロールするとアニメーションが止まってしまうんですよ。 こちらを参考に↓ 【iOS】NSTimer を別スレッドにて実行する方法 http://blog.77jp.net/iphone-dev-nstimer-other-thread-sample 短くした場合のみ起こるとのことなのでなにか分かったら追記します。
nyancoro

2016/03/31 17:11

奥深いですね...!勉強になります。 追記してくださるとのことありがとうございます! 今回の件、大変助かりましたm(__)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問