我正在使用CADisplayLink作为频闪的计时器。
我有2个CADisplayLinks:
主要的一个(这在整个过程中运行):
SMPTELink = [CADisplayLink displayLinkWithTarget:self selector:@selector(onTick)];
SMPTELink.frameInterval = 1;
[SMPTELink addToRunLoop:[NSRunLoop mainRunLoop]
forMode:NSDefaultRunLoopMode];
选通脉冲(仅在频闪发生时运行):
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.
一次运行两个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;
}
}
答案 0 :(得分:2)
显示链接的要点是能够在每次刷新屏幕时绘制。我不明白为什么你需要两个(因为它仍然会在显示刷新时被调用)。你不能只使用一个,每次刷新确定要显示什么颜色?
答案 1 :(得分:0)
它还不错..它只是毫无意义。
为什么你需要两个? CADisplayLink的目的是在每次刷新显示时触发方法。如果您希望以两种不同的速率发生两种不同的事情,那么让显示链接触发一个名为refreshView的方法:或沿着这些线的某种方式。然后在此方法中执行自定义逻辑以确定是否有时间切换选通。