【swift】NSTimerを使って2枚の画像を交互に連続して出したい
解決済
回答 1
投稿
- 評価
- クリップ 1
- VIEW 2,063
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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
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()
}
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.37%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2016/03/31 23:53
viewDidAppear内で呼び出していますが、初めだけ切り替わりのタイミングがおかしいです。
やって頂いた出力から考えるに、
メソッドの呼ばれるタイミングは正常だが、UIImageViewに表示されるタイミングが遅いということでしょうか?
2016/04/01 00:11
質問では → セットした時間より短い時間で動作しているように見受けられます。とのことですが、先ほどのコメントでは → UIImageViewに表示されるタイミングが遅いということでしょうか?
との事ですが、表示されるのが遅いのでしょうか、早いのでしょうか?
ちなみにメソッドはメインスレッドでメソッドは実行されているという認識で大丈夫でしょうか?
2016/04/01 00:33
2016/04/01 01:03
一枚目だけ表示されている時間が短い、ということです。
【メソッドが呼ばれる→UIImageViewに新しいimageが表示される】
という流れだと思うのですが、UIImageViewにimageがセットされるまでにタイムラグがあるのかな?と思った次第です。
メインスレッドです。
新しいプロジェクトを作って実行してもやはり1枚目の表示時間だけが短く感じられます。
2016/04/01 01:34
タイマーが何かの影響を受けているかもしれないので生成した直ぐ後に以下の1行を加えて試してもらいたいです。
NSRunLoop.currentRunLoop().addTimer(timerOfChangeImages, forMode: NSRunLoopCommonModes)
2016/04/01 01:48
ありがとうございました!
2016/04/01 01:56
2016/04/01 01:56
2秒に設定した場合は特に短くは感じませんでした。
0.2秒などと短く設定するのはよくないのでしょうか?
また0.2秒に設定した状態でNSRunLoop.currentRunLoop().addTimerを実行しても変化は見られず、やはり短く感じられました。(未熟なのでこのコードが何を意味するのか理解が及びませんが...)
2016/04/01 02:03
こちらを参考に↓
【iOS】NSTimer を別スレッドにて実行する方法
http://blog.77jp.net/iphone-dev-nstimer-other-thread-sample
短くした場合のみ起こるとのことなのでなにか分かったら追記します。
2016/04/01 02:11
追記してくださるとのことありがとうございます!
今回の件、大変助かりましたm(__)m