2012-09-22 37 views
4

如果需要更高級的曲線,缺少UIView基於塊的動畫方法中的自定義緩動曲線會導致Core Animation。用自定義緩動曲線重新實現UIView基於動畫方法

How to create custom easing function with Core Animation?中討論了使用CAKeyframeAnimation上的類別進行此操作的方法。

爲了保持我的代碼清潔和可維護,我想更進一步並重新實現UIView的基於塊的方法,幷包含一個描述緩動曲線功能的塊。導致上UIView類別將是這個樣子:

+ (void)animateWithDuration:(NSTimeInterval)duration easingCurveFunction:(double(^)(double))function animations:(void (^)(void))animations; 

沒有人有蘋果如何實現基於塊的激勵方法的想法?

+2

好像你可以覆蓋層的委託方法'-actionForKey:forLayer:'(或任何它被稱爲)至提供正確的動畫,只要從傳遞的動畫塊中進行屬性更改...那就是我無論如何要開始的地方 – nielsbot

+2

請查看https://github.com/zrxq/UIView-EasingFunctions – zrxq

回答

0

我不知道蘋果是如何實現自己的基於塊的方法,但閱讀BlocksKit源代碼,我明白,實現你所提到的方法,你可能需要:

  1. 聲明一個UIView類如UIView的(塊)
  2. 在類別中,添加的NSTimer屬性火/與給定持續時間
  3. 無效定時器 在類別中,添加嵌段性保持 easingCurveFunction塊碼
  4. 在類別,增加另一塊perty保持動畫塊 代碼
  5. 在您的基於塊的方法,設置定時器,該塊代碼保存到 性能
  6. 當計時器火災,運行easingCurveFunction塊和 動畫塊,你讓他們在性能

其實我加入我自己的基於塊的方法,以蘋果的類時遵循了這一做法。

+0

問題在於我們不沒有充分利用CoreAnimation提供的動畫......它可以工作,但它會要求主線程沒有任何繁重的工作或任何提升......使用起來很棒GPU和CoreAnimation的全部功能。 – hfossli

5

我不確定要創建基於塊的方法,但我發現實現自定義緩動功能並仍使用基於塊的動畫的一種相當簡單的方法是覆蓋圖層的addAnimation:(CAAnimation *)anim forKey:(NSString *)key方法和交換一個不同的緩動函數適用於任何想要動畫的視圖。

開始,子類的CALayer,並添加下面的方法...

// CustomViewLayer.m 

#import "CustomViewLayer.h" 

@implementation CustomViewLayer 

- (void)addAnimation:(CAAnimation *)anim forKey:(NSString *)key 
{ 
    if ([anim isKindOfClass:[CABasicAnimation class]]) { 

     // intercept the animation and insert your own easing function 
     int x1 = 0.250; 
     int y1 = 1.185; 
     int x2 = 0.210; 
     int y2 = 1.000; 
     CAMediaTimingFunction *func = [CAMediaTimingFunction functionWithControlPoints:x1 :y1 :x2 :y2]; 
     anim.timingFunction = func;  
    } 

    [super addAnimation:anim forKey:key]; 
} 

@end 

您認爲子類,確保你返回定製層類...

// CustomView.m 

#import "CustomView.h" 
#import "CustomViewLayer.h" 

@implementation CustomView 

+ (Class)layerClass 
{ 
    return [CustomViewLayer class]; 
} 

@end 

然後,您可以使用標準的基於塊的動畫方法,如...

[UIView animateWithDuration:0.3 animations:^{ 
    [customView setFrame:newFrame]; 
}]; 

...和自定義簡易ng函數將被使用。它可能無法解決你所有的問題,但它很容易做到,它仍然允許你使用基於塊的動畫。但請記住,緩動功能將適用於通過基於塊的方法動畫的任何和所有動畫。所以,如果你想動畫的alpha屬性爲例,但不想使用自定義緩動功能,你將不得不擺弄它,或者可能完全提出一個不同的解決方案。

最後,對於容易創建和測試緩和功能的真棒工具可以在這裏找到:http://matthewlein.com/ceaser/