前回、メニュー選択中は 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