RBBAnimation

Block-based animations made easy, comes with easing functions and a CASpringAnimation replacement.

2059
190
Objective-C

RBBAnimation

RBBAnimation is a subclass of CAKeyframeAnimation that allows you to
declare your animations using blocks instead of writing out all the
individual key-frames.

This gives you greater flexibility when specifying your animations while keeping
your code concise.

It comes out of the box with a replacement for
CASpringAnimation
, support for custom easing functions
such as bouncing
as well as hooks to allow your writing
your own animations fully from scratch.

Installation

To install RBBAnimation, I recommend the excellent CocoaPods. Simply add this
to your Podfile

pod 'RBBAnimation', '0.4.0'

and you are ready to go!

If you’d like to run the bundled test app, make sure to install its dependencies
by running

pod install

after cloning the repo.

RBBCustomAnimation

Use RBBCustomAnimation to create arbitrary animations by passing in an
RBBAnimationBlock:

Rainbow

RBBCustomAnimation *rainbow = [RBBCustomAnimation animationWithKeyPath:@"backgroundColor"];

rainbow.animationBlock = ^(CGFloat elapsed, CGFloat duration) {
    UIColor *color = [UIColor colorWithHue:elapsed / duration
                                saturation:1
                                brightness:1
                                     alpha:1];

    return (id)color.CGColor;
};

The arguments of the block are the current position of the animation as well as
its total duration.

Most of the time, you will probably want to use the higher-level
RBBTweenAnimation.

RBBSpringAnimation

RBBSpringAnimation is a handy replacement for the private CASpringAnimation.
Specify your spring’s mass, damping, stiffness as well as its initial velocity
and watch it go:

Bouncing

RBBSpringAnimation *spring = [RBBSpringAnimation animationWithKeyPath:@"position.y"];

spring.fromValue = @(-100.0f);
spring.toValue = @(100.0f);
spring.velocity = 0;
spring.mass = 1;
spring.damping = 10;
spring.stiffness = 100;

spring.additive = YES;
spring.duration = [spring durationForEpsilon:0.01];

RBBTweenAnimation

RBBTweenAnimation allows you to animate from one value to another, similar to
CABasicAnimation but with a greater flexibility in how the values should be
interpolated.

It supports the same cubic Bezier interpolation that you get from
CAMediaTimingFunction using the RBBCubicBezier helper function:

Ease In Out Back

RBBTweenAnimation *easeInOutBack = [RBBTweenAnimation animationWithKeyPath:@"position.y"];

easeInOutBack.fromValue = @(-100.0f);
easeInOutBack.toValue = @(100.0f);
easeInOutBack.easing = RBBCubicBezier(0.68, -0.55, 0.265, 1.55);

easeInOutBack.additive = YES;
easeInOutBack.duration = 0.6;

However, RBBTweenAnimation also supports more complex easing functions such as
RBBEasingFunctionEaseOutBounce:

Bouncing

RBBTweenAnimation *bounce = [RBBTweenAnimation animationWithKeyPath:@"position.y"];
bounce.fromValue = @(-100);
bounce.toValue = @(100);
bounce.easing = RBBEasingFunctionEaseOutBounce;

bounce.additive = YES;
bounce.duration = 0.8;

You can also specify your own easing functions, from scratch:

RBBTweenAnimation *sinus = [RBBTweenAnimation animationWithKeyPath:@"position.y"];
sinus.fromValue = @(0);
sinus.toValue = @(100);

sinus.easing = ^CGFloat (CGFloat fraction) {
    return sin((fraction) * 2 * M_PI);
};

sinus.additive = YES;
sinus.duration = 2;

Sine Wave

License

RBBAnimation was built by Robert Böhnke. It is licensed under the MIT
License.

If you use RBBAnimation in one of your apps, I’d love to hear about it. Feel
free to follow me on Twitter where I’m @ceterum_censeo.