2013-02-21 95 views
0

我正在使用CADisplayLink作爲頻閃計時器。一次運行多個CADisplayLinks?

我有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. 

一次運行兩個CADisplayLinks不好嗎?有時我的頻閃看起來並不像我認爲的那樣平滑。這裏是我的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; 
    } 

} 

回答

2

顯示鏈接的一點是一定要能夠與屏幕的每次刷新畫。我不明白你爲什麼需要兩個(因爲當顯示刷新時它仍然會被調用)。你不能只使用一個,每次刷新確定顯示什麼顏色?

+0

想通過一種方法將它整合到一個CADisplayLink中 - 效果很棒! – objectiveccoder001 2013-02-22 05:09:08

+0

從API角度來看,通過檢查其他人是否已經存在或不存在來增加複雜性是有意義的。 – hfossli 2013-12-09 19:15:15

0

它不壞..它沒有意義。

爲什麼你需要兩個? CADisplayLink的目的是在每次刷新顯示時觸發一個方法。如果你想以兩種不同的速率發生兩種不同的事情,那麼讓顯示鏈接觸發一個叫做refreshView的方法:或者沿着這些方向。然後在這個方法中做你的自定義邏輯來確定是否有時間來切換頻閃。

+0

從API的角度來看,通過檢查其他人是否已經存在不增加複雜性是有意義的。 – hfossli 2013-12-09 19:15:35