重新实现自定义缓动曲线的UIView基于块的激励方法(Reimplement UIView bloc

2019-07-31 19:30发布

如果需要更高级的曲线缺乏风俗的UIView的基于块的动画方法缓和曲线导致核心动画。

与类别这样的一种方式CAKeyframeAnimation在讨论如何与核心动画创建自定义缓动函数? 。

为了保持我的代码清洁和维护,我想更进一步,并重新实现UIView基于的块的方法和包括描述缓和曲线功能块。 导致对类别UIView会是这个样子:

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

有没有人有苹果如何实现他们的基于块的动画方法的想法?

Answer 1:

我不知道如何创建一个基于块的方法,但我发现,要实现自定义缓动函数,并仍然使用基于块的动画一个相当简单的方式是覆盖层的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/



Answer 2:

我不知道苹果是如何实现自己的基于块的方法,但阅读BlocksKit源代码,我明白,实现你所提到的方法,你可能需要:

  1. 声明一个UIView类如UIView的(块)
  2. 在类别,一个的NSTimer属性添加到火/无效给定时间的计时器
  3. 在类别中,添加一个块属性保持easingCurveFunction块码
  4. 在类别,增加另一块perty保持动画块码
  5. 在基于块的方法中,设置定时器,保存块代码属性
  6. 当计时器火灾,运行easingCurveFunction块和动画块,你让他们在性能

加入我自己的基于块的方法苹果公司的班当我真正遵循了这一做法。



文章来源: Reimplement UIView block based animation methods with custom easing curve