61 lines
2.3 KiB
Objective-C
61 lines
2.3 KiB
Objective-C
//
|
|
// CALayer+PKDownloadButtonAnimations.m
|
|
// Download
|
|
//
|
|
// Created by Pavel on 31/05/15.
|
|
// Copyright (c) 2015 Katunin. All rights reserved.
|
|
//
|
|
|
|
#import "CALayer+PKDownloadButtonAnimations.h"
|
|
|
|
static NSString *kRorationEndKey = @"PKLayerRorationEndKey";
|
|
|
|
@implementation CALayer (PKDownloadButtonAnimations)
|
|
|
|
- (void)addRotationAnimationWithKey:(NSString *)animationKey fullRotationDuration:(NSTimeInterval)fullRotationDuration {
|
|
NSNumber *fromValue = [self.presentationLayer valueForKeyPath:@"transform.rotation"];
|
|
[self removeAnimationForKey:kRorationEndKey];
|
|
|
|
CABasicAnimation *rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation"];
|
|
rotationAnimation.fromValue = fromValue;
|
|
rotationAnimation.toValue = @([rotationAnimation.fromValue floatValue] + (2. * M_PI));
|
|
rotationAnimation.duration = fullRotationDuration;
|
|
rotationAnimation.repeatCount = HUGE_VALF;
|
|
rotationAnimation.removedOnCompletion = NO;
|
|
|
|
[self addAnimation:rotationAnimation forKey:animationKey];
|
|
}
|
|
|
|
- (void)removeRotationAnimationWithKey:(NSString *)animationKey {
|
|
[self removeRotationAnimationWithKey:animationKey fullRotationDuration:0.0];
|
|
}
|
|
|
|
- (void)removeRotationAnimationWithKey:(NSString *)animationKey fullRotationDuration:(NSTimeInterval)fullRotationDuration {
|
|
NSNumber *fromValue = [self.presentationLayer valueForKeyPath:@"transform.rotation"];
|
|
NSNumber *toValue = @((fromValue.doubleValue < 0.0) ? 0.0 : 2.0 * M_PI);
|
|
|
|
[self removeAnimationForKey:animationKey];
|
|
|
|
const NSTimeInterval animationDuration = ABS(toValue.doubleValue - fromValue.doubleValue) * (fullRotationDuration / (2.0 * M_PI));
|
|
|
|
if (fromValue.doubleValue != 0.0 && ![fromValue isEqualToNumber:toValue] && animationDuration > 0.0) {
|
|
[CATransaction begin];
|
|
CABasicAnimation *rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation"];
|
|
rotationAnimation.fromValue = fromValue;
|
|
rotationAnimation.toValue = toValue;
|
|
rotationAnimation.duration = animationDuration;
|
|
|
|
[CATransaction setCompletionBlock:^{
|
|
[self removeAnimationForKey:kRorationEndKey];
|
|
}];
|
|
|
|
[self addAnimation:rotationAnimation forKey:kRorationEndKey];
|
|
[CATransaction commit];
|
|
}
|
|
else {
|
|
[self removeAnimationForKey:kRorationEndKey];
|
|
}
|
|
}
|
|
|
|
@end
|