如果需要更高级的曲线缺乏风俗的UIView的基于块的动画方法缓和曲线导致核心动画。
与类别这样的一种方式CAKeyframeAnimation
在讨论如何与核心动画创建自定义缓动函数? 。
为了保持我的代码清洁和维护,我想更进一步,并重新实现UIView
基于的块的方法和包括描述缓和曲线功能块。 导致对类别UIView
会是这个样子:
+ (void)animateWithDuration:(NSTimeInterval)duration easingCurveFunction:(double(^)(double))function animations:(void (^)(void))animations;
有没有人有苹果如何实现他们的基于块的动画方法的想法?
我不知道如何创建一个基于块的方法,但我发现,要实现自定义缓动函数,并仍然使用基于块的动画一个相当简单的方式是覆盖层的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/
我不知道苹果是如何实现自己的基于块的方法,但阅读BlocksKit源代码,我明白,实现你所提到的方法,你可能需要:
- 声明一个UIView类如UIView的(块)
- 在类别,一个的NSTimer属性添加到火/无效给定时间的计时器
- 在类别中,添加一个块属性保持easingCurveFunction块码
- 在类别,增加另一块perty保持动画块码
- 在基于块的方法中,设置定时器,保存块代码属性
- 当计时器火灾,运行easingCurveFunction块和动画块,你让他们在性能
加入我自己的基于块的方法苹果公司的班当我真正遵循了这一做法。