ストロボのタイマーとしてCADisplayLinkを使用しています。
私は2つのCADisplayLinksを持っています:
主なもの(これはすべての間に実行されます):
SMPTELink = [CADisplayLink displayLinkWithTarget:self selector:@selector(onTick)];
SMPTELink.frameInterval = 1;
[SMPTELink addToRunLoop:[NSRunLoop mainRunLoop]
forMode:NSDefaultRunLoopMode];
ストロボ1つ(これはストロボが発生したときにのみ実行されます):
strobeLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(toggleStrobe)];
strobeLink.frameInterval = 1;
[strobeLink addToRunLoop:[NSRunLoop mainRunLoop]
forMode:NSDefaultRunLoopMode];
[strobeLink setPaused:YES]; // I setPaused:NO when using the strobe.
2つのCADisplayLinkを同時に実行するのは悪いことですか?ストロボが思ったほどスムーズに見えないことがあります。これが私のtoggleStrobeメソッドです。
-(void)toggleStrobe {
if (!self.firstTimestampStrobe)
self.firstTimestampStrobe = strobeLink.timestamp;
NSTimeInterval elapsed = (strobeLink.timestamp - self.firstTimestampStrobe);
NSInteger frameNumber = (NSInteger)(elapsed * ((strobeValue*15)/255)) % 2;
if (frameNumber != self.lastFrameStrobe)
{
if (frameNumber == 1) {
UIColor *color = [[UIColor alloc] initWithRed: 0 green: 0 blue: 0 alpha: 1.0];
strobeBackground.backgroundColor = color;
} else {
UIColor *color = [[UIColor alloc] initWithRed: 0 green: 0 blue: 0 alpha: 0];
strobeBackground.backgroundColor = color;
}
self.lastFrameStrobe = frameNumber;
}
}