Block-based animations made easy, comes with easing functions and a CASpringAnimation replacement.
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.
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.
Use RBBCustomAnimation
to create arbitrary animations by passing in an
RBBAnimationBlock
:
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
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:
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
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:
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
:
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;
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.