ページ

2008年3月9日日曜日

画面キャプチャその9 - タイマー取り込み(3)

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

前回、メニュー選択中は NSTimerが発火しないことが分かった。NSTimerのリファレンスを読んでみる。

NSTimer Class Reference

Overview によると NSTimerは3つの生成方法があるらしい。

(1) current NSRunLoop + NSDefaultRunLoopMode の組み合わせ
(2) Run Loop と Mode ができる
(3) 初回コールバックの日時を NSDateで指定できる


前回まで使っていたのは (1)の方法。scheduleから始まるクラスメソッドを使う場合がこれに相当する。

[NSTimer scheduledTimerWithTimeInterval:1.0
target:_fullscreen_view
selector:@selector(fire:)
userInfo:nil
repeats:YES];


これだとメニュー操作中は NSTimerのコールバックが機能しない。

そこで (2)の方法を取ってみた。timerから始まるクラスメソッドがこれにあたる。
NSTimer* timer = [NSTimer timerWithTimeInterval:1.0
target:_fullscreen_view
selector:@selector(fire:)
userInfo:nil
repeats:YES];
[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];


timerWithTimeInterval:.. で NSTimerを作っただけではコールバックが起動しないので、これを NSRunLoop へ追加してやる。この時、NSRunLoopCommonModes を指定するとうまくいった。NSRunLoopCommonModesは MacOSX10.5から追加されたモード。モードの種類は NSRunLoop のリファレンスに書いてある。

NSRunLoop Class Reference - Run Loop Modes


これで無事メニュー操作中のスクリーンショットも取れるようになった。



ソース:FullScreenSample-9.zip