Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

CAShapeLayer: strokeStart, strokeEnd, fillColor properties animation #1672

Merged
merged 4 commits into from
Jun 16, 2015
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions JazzHands/IFTTTAnimation.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,15 @@
@interface IFTTTAnimation : NSObject

@property (strong, nonatomic) UIView *view;
@property (strong, nonatomic) CALayer *layer;
@property (strong, nonatomic) NSLayoutConstraint *constraint;
@property (strong, nonatomic) NSMutableArray *keyFrames;

+ (instancetype)animationWithView:(UIView *)view;
+ (instancetype)animationWithLayer:(CALayer *)layer;

- (id)initWithView:(UIView *)view;
- (id)initWithLayer:(CALayer *)layer;

- (void)animate:(NSInteger)time;

Expand Down
14 changes: 14 additions & 0 deletions JazzHands/IFTTTAnimation.m
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,11 @@ + (instancetype)animationWithView:(UIView *)view
return [[self alloc] initWithView:view];
}

+ (instancetype)animationWithLayer:(CALayer *)layer
{
return [(IFTTTAnimation *)[self alloc] initWithLayer:layer];
}

- (id)init
{
if ((self = [super init])) {
Expand All @@ -44,6 +49,15 @@ - (id)initWithView:(UIView *)view
return self;
}

- (id)initWithLayer:(CALayer *)layer
{
if ((self = [self init])) {
self.layer = layer;
}

return self;
}

- (void)addKeyFrames:(NSArray *)keyFrames
{
for (IFTTTAnimationKeyFrame *keyFrame in keyFrames) {
Expand Down
3 changes: 3 additions & 0 deletions JazzHands/IFTTTAnimationFrame.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,4 +21,7 @@
@property (nonatomic, assign) CGFloat scale;
@property (nonatomic, assign) CGFloat constraintConstant;

@property (nonatomic, assign) CGFloat strokeStart;
@property (nonatomic, assign) CGFloat strokeEnd;

@end
6 changes: 6 additions & 0 deletions JazzHands/IFTTTAnimationKeyFrame.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@
+ (NSArray *)keyFramesWithTimesAndTransform3D:(NSInteger)pairCount,...;
+ (NSArray *)keyFramesWithTimesAndScales:(NSInteger)pairCount,...;
+ (NSArray *)keyFramesWithTimesAndConstraint:(NSInteger)pairCount,...;
+ (NSArray *)keyFramesWithTimesAndStrokeStarts:(NSInteger)pairCount,...;
+ (NSArray *)keyFramesWithTimesAndStrokeEnds:(NSInteger)pairCount,...;

+ (instancetype)keyFrameWithTime:(NSInteger)time andAlpha:(CGFloat)alpha;
+ (instancetype)keyFrameWithTime:(NSInteger)time andCornerRadius:(CGFloat)cornerRadius;
Expand All @@ -38,6 +40,8 @@
+ (instancetype)keyFrameWithTime:(NSInteger)time andTransform3D:(IFTTTTransform3D *)transform;
+ (instancetype)keyFrameWithTime:(NSInteger)time andScale:(CGFloat)scale;
+ (instancetype)keyFrameWithTime:(NSInteger)time andConstraint:(CGFloat)constraint;
+ (instancetype)keyFrameWithTime:(NSInteger)time andStrokeStart:(CGFloat)strokeStart;
+ (instancetype)keyFrameWithTime:(NSInteger)time andStrokeEnd:(CGFloat)strokeEnd;

- (id)initWithTime:(NSInteger)time andAlpha:(CGFloat)alpha;
- (id)initWithTime:(NSInteger)time andCornerRadius:(CGFloat)cornerRadius;
Expand All @@ -48,6 +52,8 @@
- (id)initWithTime:(NSInteger)time andTransform3D:(IFTTTTransform3D *)transform;
- (id)initWithTime:(NSInteger)time andScale:(CGFloat)scale;
- (id)initWithTime:(NSInteger)time andConstraint:(CGFloat)constraint;
- (id)initWithTime:(NSInteger)time andStrokeStart:(CGFloat)strokeStart;
- (id)initWithTime:(NSInteger)time andStrokeEnd:(CGFloat)strokeEnd;

@property (assign, nonatomic) NSInteger time;

Expand Down
88 changes: 88 additions & 0 deletions JazzHands/IFTTTAnimationKeyFrame.m
Original file line number Diff line number Diff line change
Expand Up @@ -246,6 +246,64 @@ + (NSArray *)keyFramesWithTimesAndConstraint:(NSInteger)pairCount, ... {
}
}

+ (NSArray *)keyFramesWithTimesAndStrokeStarts:(NSInteger)pairCount, ... {

va_list argumentList;

NSInteger time;
CGFloat strokeStart;

if (pairCount > 0) {
NSMutableArray *keyFrames = [NSMutableArray arrayWithCapacity:(NSUInteger)pairCount];

va_start(argumentList, pairCount);

for (int i = 0; i < pairCount; i++) {
time = va_arg(argumentList, NSInteger);
strokeStart = (CGFloat)va_arg(argumentList, double);
IFTTTAnimationKeyFrame *keyFrame = [IFTTTAnimationKeyFrame keyFrameWithTime:time
andStrokeStart:strokeStart];
[keyFrames addObject:keyFrame];
}

va_end(argumentList);

return [NSArray arrayWithArray:keyFrames];
}
else {
return nil;
}
}

+ (NSArray *)keyFramesWithTimesAndStrokeEnds:(NSInteger)pairCount, ... {

va_list argumentList;

NSInteger time;
CGFloat strokeEnd;

if (pairCount > 0) {
NSMutableArray *keyFrames = [NSMutableArray arrayWithCapacity:(NSUInteger)pairCount];

va_start(argumentList, pairCount);

for (int i = 0; i < pairCount; i++) {
time = va_arg(argumentList, NSInteger);
strokeEnd = (CGFloat)va_arg(argumentList, double);
IFTTTAnimationKeyFrame *keyFrame = [IFTTTAnimationKeyFrame keyFrameWithTime:time
andStrokeEnd:strokeEnd];
[keyFrames addObject:keyFrame];
}

va_end(argumentList);

return [NSArray arrayWithArray:keyFrames];
}
else {
return nil;
}
}

+ (instancetype)keyFrameWithTime:(NSInteger)time andAlpha:(CGFloat)alpha
{
IFTTTAnimationKeyFrame *keyFrame = [[self alloc] initWithTime:time
Expand Down Expand Up @@ -312,6 +370,20 @@ + (instancetype)keyFrameWithTime:(NSInteger)time andConstraint:(CGFloat)constrai
return keyFrame;
}

+ (instancetype)keyFrameWithTime:(NSInteger)time andStrokeStart:(CGFloat)strokeStart {
IFTTTAnimationKeyFrame *keyFrame = [[self alloc] initWithTime:time
andStrokeStart:strokeStart];

return keyFrame;
}

+ (instancetype)keyFrameWithTime:(NSInteger)time andStrokeEnd:(CGFloat)strokeEnd {
IFTTTAnimationKeyFrame *keyFrame = [[self alloc] initWithTime:time
andStrokeEnd:strokeEnd];

return keyFrame;
}

- (id)initWithTime:(NSInteger)time
{
if ((self = [self init])) {
Expand Down Expand Up @@ -401,4 +473,20 @@ - (id)initWithTime:(NSInteger)time andConstraint:(CGFloat)constraint {
return self;
}

- (id)initWithTime:(NSInteger)time andStrokeStart:(CGFloat)strokeStart {
if ((self = [self initWithTime:time])) {
self.strokeStart = strokeStart;
}

return self;
}

- (id)initWithTime:(NSInteger)time andStrokeEnd:(CGFloat)strokeEnd {
if ((self = [self initWithTime:time])) {
self.strokeEnd = strokeEnd;
}

return self;
}

@end
13 changes: 13 additions & 0 deletions JazzHands/IFTTTFillColorAnimation.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
//
// IFTTTFillColorAnimation.h
// JazzHands
//
// Created by Pierluigi D'Andrea on 07/05/15.
// Copyright (c) 2015 IFTTT Inc. All rights reserved.
//

#import "IFTTTAnimation.h"

@interface IFTTTFillColorAnimation : IFTTTAnimation

@end
63 changes: 63 additions & 0 deletions JazzHands/IFTTTFillColorAnimation.m
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
//
// IFTTTFillColorAnimation.m
// JazzHands
//
// Created by Pierluigi D'Andrea on 07/05/15.
// Copyright (c) 2015 IFTTT Inc. All rights reserved.
//

#import "IFTTTJazzHands.h"

@implementation IFTTTFillColorAnimation

- (id)initWithLayer:(CALayer *)layer {
NSCParameterAssert([layer isKindOfClass:CAShapeLayer.class]);
return [super initWithLayer:layer];
}

- (void)animate:(NSInteger)time
{
if (self.keyFrames.count <= 1) return;

IFTTTAnimationFrame *animationFrame = [self animationFrameForTime:time];
((CAShapeLayer *)self.layer).fillColor = animationFrame.color.CGColor;
}


- (IFTTTAnimationFrame *)frameForTime:(NSInteger)time
startKeyFrame:(IFTTTAnimationKeyFrame *)startKeyFrame
endKeyFrame:(IFTTTAnimationKeyFrame *)endKeyFrame
{
IFTTTAnimationFrame *animationFrame = [IFTTTAnimationFrame new];

CGFloat startRed, startBlue, startGreen, startAlpha;
CGFloat endRed = 0, endBlue = 0, endGreen = 0, endAlpha = 0;

if ([self iftttGetRed:&startRed green:&startGreen blue:&startBlue alpha:&startAlpha fromColor:startKeyFrame.color] &&
[self iftttGetRed:&endRed green:&endGreen blue:&endBlue alpha:&endAlpha fromColor:endKeyFrame.color]) {
CGFloat red = [self tweenValueForStartTime:startKeyFrame.time endTime:endKeyFrame.time startValue:startRed endValue:endRed atTime:time];
CGFloat green = [self tweenValueForStartTime:startKeyFrame.time endTime:endKeyFrame.time startValue:startGreen endValue:endGreen atTime:time];
CGFloat blue = [self tweenValueForStartTime:startKeyFrame.time endTime:endKeyFrame.time startValue:startBlue endValue:endBlue atTime:time];
CGFloat alpha = [self tweenValueForStartTime:startKeyFrame.time endTime:endKeyFrame.time startValue:startAlpha endValue:endAlpha atTime:time];
animationFrame.color = [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
}

return animationFrame;
}

- (BOOL) iftttGetRed:(CGFloat *)red green:(CGFloat *)green blue:(CGFloat *)blue alpha:(CGFloat *)alpha fromColor:(UIColor *)color {
CGFloat white;

if ([color getRed:red green:green blue:blue alpha:alpha]) {
return YES;
} else if ([color getWhite:&white alpha:alpha]) {
*red = white;
*green = white;
*blue = white;
return YES;
}

return NO;
}

@end
3 changes: 3 additions & 0 deletions JazzHands/IFTTTJazzHands.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,3 +26,6 @@
#import "IFTTTTransform3DAnimation.h"
#import "IFTTTScaleAnimation.h"
#import "IFTTTConstraintsAnimation.h"
#import "IFTTTStrokeStartAnimation.h"
#import "IFTTTStrokeEndAnimation.h"
#import "IFTTTFillColorAnimation.h"
13 changes: 13 additions & 0 deletions JazzHands/IFTTTStrokeEndAnimation.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
//
// IFTTTStrokeEndAnimation.h
// JazzHands
//
// Created by Pierluigi D'Andrea on 06/05/15.
// Copyright (c) 2015 IFTTT Inc. All rights reserved.
//

#import "IFTTTAnimation.h"

@interface IFTTTStrokeEndAnimation : IFTTTAnimation

@end
41 changes: 41 additions & 0 deletions JazzHands/IFTTTStrokeEndAnimation.m
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
//
// IFTTTStrokeEndAnimation.m
// JazzHands
//
// Created by Pierluigi D'Andrea on 06/05/15.
// Copyright (c) 2015 IFTTT Inc. All rights reserved.
//

#import "IFTTTJazzHands.h"

@implementation IFTTTStrokeEndAnimation

- (id)initWithLayer:(CALayer *)layer {
NSCParameterAssert([layer isKindOfClass:CAShapeLayer.class]);
return [super initWithLayer:layer];
}

- (void)animate:(NSInteger)time
{
if (self.keyFrames.count <= 1) return;

IFTTTAnimationFrame *animationFrame = [self animationFrameForTime:time];
((CAShapeLayer *)self.layer).strokeEnd = animationFrame.strokeEnd;
}

- (IFTTTAnimationFrame *)frameForTime:(NSInteger)time
startKeyFrame:(IFTTTAnimationKeyFrame *)startKeyFrame
endKeyFrame:(IFTTTAnimationKeyFrame *)endKeyFrame
{
IFTTTAnimationFrame *animationFrame = [IFTTTAnimationFrame new];
animationFrame.strokeEnd = [self tweenValueForStartTime:startKeyFrame.time
endTime:endKeyFrame.time
startValue:startKeyFrame.strokeEnd
endValue:endKeyFrame.strokeEnd
atTime:time];

return animationFrame;
}


@end
13 changes: 13 additions & 0 deletions JazzHands/IFTTTStrokeStartAnimation.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
//
// IFTTTStrokeStartAnimation.h
// JazzHands
//
// Created by Pierluigi D'Andrea on 06/05/15.
// Copyright (c) 2015 IFTTT Inc. All rights reserved.
//

#import "IFTTTAnimation.h"

@interface IFTTTStrokeStartAnimation : IFTTTAnimation

@end