2012-07-23 69 views
0

我想創建閃爍效果,類似於打開熒光燈。序列大約需要2秒鐘。因爲它是在黑色背景(和圖像是白色的),我可以在這樣的順序調整阿爾法:依次更改UIView的屬性,但沒有動畫?

0.5sec Alpha = 1.0; 
0.15sec Alpha = 0.0; 
0.4sec Alpha = 1.0; 
0.35sec Alpha = 0.0; 
0.3sec Alpha = 1.0; 
0.1sec Alpha = 0.0; 
~  Alpha = 1.0; 

在這一點上,阿爾法是在1.0和id想離開那裏。問題在於我不能改變這些值,因爲它們只會排隊等待繪圖,而不會立即發生,相反,它們都會在下次繪製UI時立即發生,而不會產生閃爍效果。

我也不能使用UIView.animate塊,因爲這會在指定的時間內對視圖的alpha進行補間/動畫,我不希望它平滑,我希望它在alpha級別之間立即閃爍。

我可能使用UIImageView圖像幀動畫,但想知道是否有更清潔,更快,更簡單的方法?

回答

2

使用NSTimer。這就是我會做(僞代碼):如果你有一些模式來忽悠你可以做的東西不是很長的開關更好,也許只是有一些像if (timeSpent % 5 == 0) { alpha = 1.0; } else { alpha = 0.0; }

編輯

timer = new scheduledTimer(0.5 seconds) selector:flicker() repeats:YES; 
timeSpent = 0; 

    flicker() 
    { 
     timeSpent+= 5; 
     switch(seconds) 
      case 5: alpha = 1.0; break; 
      case 15: alpha = 0.0; break; 
    ... 
     case 120: alpha = 1.0; [timer invalidate]; break; 

    } 

:如何關於這樣的事情:

CAKeyframeAnimation* animation = [CAKeyframeAnimation animationWithKeyPath: @"opacity"]; 
    animation.duration = 0.7f; 
    animation.values = [NSArray arrayWithObjects: 
          [NSNumber numberWithFloat:1.0f], 
          [NSNumber numberWithFloat:1.0f], 
          [NSNumber numberWithFloat:0.0f], 
          [NSNumber numberWithFloat:0.0f], 
          [NSNumber numberWithFloat:1.0f], 

          [NSNumber numberWithFloat:1.0f], 
          [NSNumber numberWithFloat:0.0f], 
          [NSNumber numberWithFloat:0.0f], 
          [NSNumber numberWithFloat:1.0f], 
          [NSNumber numberWithFloat:1.0f], 

          [NSNumber numberWithFloat:0.0f], 
          [NSNumber numberWithFloat:0.0f], 
          [NSNumber numberWithFloat:1.0f], 
          nil]; 
    animation.keyTimes = [NSArray arrayWithObjects: 
          [NSNumber numberWithFloat:0.1f], 
          [NSNumber numberWithFloat:0.2f], 
          [NSNumber numberWithFloat:0.2f], 
          [NSNumber numberWithFloat:0.3f], 
          [NSNumber numberWithFloat:0.3f], 

          [NSNumber numberWithFloat:0.4f], 
          [NSNumber numberWithFloat:0.4f], 
          [NSNumber numberWithFloat:0.5f], 
          [NSNumber numberWithFloat:0.5f], 
          [NSNumber numberWithFloat:0.6f], 

          [NSNumber numberWithFloat:0.6f], 
          [NSNumber numberWithFloat:0.7f], 
          [NSNumber numberWithFloat:0.7f], 
          nil];  

    [self.view.layer addAnimation:animation forKey:nil]; 
+0

這不會工作,因爲改變alpha(或任何視圖的任何屬性)直到UI線程重繪它纔會生效。我可以在每個之後調用SetNeedsDisplay(),但仍不能保證它會立即發生。結果是所有更改都一次應用,不會導致動畫/閃爍。如果長時間的變化(比如0.5秒+),這將起作用,但是如果試圖模擬熒光燈開啓時的閃爍,一些閃爍會很短(約0.1秒)。 – Dermot 2012-07-23 11:41:56

+0

好的,CAKeyframeAnimation怎麼樣?查看我編輯回答中的示例。 – vakio 2012-07-23 12:37:46

+1

將KeyFrameAnimation的CalculationMode屬性設置爲CAKeyFrameAnimation.CalculationDiscrete以防止值插值。它是線性的。 – 2012-07-23 12:41:05