我不确定是否要创建基于块的方法,但我发现实现自定义缓动函数并仍然使用基于块的动画的一种相当简单的方法是覆盖图层的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];
}];
...并且将使用自定义缓动功能。它可能无法解决您所有的问题,但它很容易做到,并且仍然允许您使用基于块的动画。但是请记住,缓动函数将适用于通过基于块的方法进行动画处理的所有动画。因此,例如,如果您想为 alpha 属性设置动画,但又不想使用自定义缓动功能,您将不得不摆弄它,或者可能会想出一个完全不同的解决方案。
最后,可以在这里找到一个用于轻松创建和测试缓动函数的很棒的工具:http: //matthewlein.com/ceaser/