Skip to content

Commit

Permalink
Merge pull request #1672 from pNre/CAShapeLayer
Browse files Browse the repository at this point in the history
CAShapeLayer: strokeStart, strokeEnd, fillColor properties animation
  • Loading branch information
lauraskelton committed Jun 16, 2015
2 parents 932ea87 + 9a03973 commit 0e2989e
Show file tree
Hide file tree
Showing 18 changed files with 307 additions and 0 deletions.

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

0 comments on commit 0e2989e

Please sign in to comment.