Music_Player3/Pods/DownloadButton/Pod/Classes/CALayer+PKDownloadButtonAnimations.m
2024-05-29 17:31:45 +08:00

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