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

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

ただいまの
回答率

88.37%

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

解決済

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 2,063

nyancoro

score 81

swiftを勉強中の者です。

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

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

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

@IBOutlet weak var _image: UIImageView!
private var timerOfChangeImages : NSTimer!

private func TimerChangeImages() {
        // タイマー開始
        timerOfChangeImages = NSTimer.scheduledTimerWithTimeInterval(0.2,
            target: self,
            selector: "Selector",
            userInfo: nil,
            repeats: true)
    }

    func Selector() {
        if _image.image == UIImage(named: "apple") {
            _image.image = UIImage(named: "banana")
            return
        }
        _image.image = UIImage(named: "apple")
    }
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

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  

private func TimerChangeImages() {
    // タイマー開始
    timerOfChangeImages = NSTimer.scheduledTimerWithTimeInterval(0.2,
                                                            target: self,
                                                          selector:"Selector",
                                                          userInfo: nil,
                                                           repeats: true)
}

// 時間出力用メソッド
func nowTime() -> String {
    let format = NSDateFormatter()
    format.dateFormat = "yyyy/MM/dd HH:mm:ss.SSS"
    return format.stringFromDate(NSDate())
}

func Selector() {
    
    print(nowTime())
    
    if _image.image == UIImage(named: "apple") {
        _image.image = UIImage(named: "banana")
        return
    }
    _image.image = UIImage(named: "apple")
}

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

override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)
    
    let imageList: [UIImage] = [UIImage(named: "apple")!,UIImage(named: "banana")!]
    _image.animationImages = imageList
    _image.animationDuration = 0.2
    _image.startAnimating()
}

@IBAction func stopAnimation(sender: UIButton) {
    _image.stopAnimating()
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/04/01 01:56

    >表示時間を2秒とか長くしても最初だけ短く表示されますか?
    2秒に設定した場合は特に短くは感じませんでした。
    0.2秒などと短く設定するのはよくないのでしょうか?

    また0.2秒に設定した状態でNSRunLoop.currentRunLoop().addTimerを実行しても変化は見られず、やはり短く感じられました。(未熟なのでこのコードが何を意味するのか理解が及びませんが...)

    キャンセル

  • 2016/04/01 02:03

    単純にNSTimerを実行中にテーブルViewなどをスクロールするとアニメーションが止まってしまうんですよ。

    こちらを参考に↓
    【iOS】NSTimer を別スレッドにて実行する方法
    http://blog.77jp.net/iphone-dev-nstimer-other-thread-sample

    短くした場合のみ起こるとのことなのでなにか分かったら追記します。

    キャンセル

  • 2016/04/01 02:11

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

    キャンセル

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

  • ただいまの回答率 88.37%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る