我不確定要創建基於塊的方法,但我發現實現自定義緩動功能並仍使用基於塊的動畫的一種相當簡單的方法是覆蓋圖層的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/
好像你可以覆蓋層的委託方法'-actionForKey:forLayer:'(或任何它被稱爲)至提供正確的動畫,只要從傳遞的動畫塊中進行屬性更改...那就是我無論如何要開始的地方 – nielsbot
請查看https://github.com/zrxq/UIView-EasingFunctions – zrxq