This repository has been archived on 2022-03-12. You can view files and clone it, but cannot push or open issues or pull requests.

82 lines
1.8 KiB
Mathematica
Raw Normal View History

2021-04-02 02:24:13 +03:00
#import <UIKit/UIKit.h>
#import "REATransitionAnimation.h"
#define DEFAULT_DURATION 0.25
#if TARGET_IPHONE_SIMULATOR
// Based on https://stackoverflow.com/a/13307674
float UIAnimationDragCoefficient(void);
#endif
CGFloat SimAnimationDragCoefficient()
{
#if TARGET_IPHONE_SIMULATOR
if (NSClassFromString(@"XCTest") != nil) {
// UIAnimationDragCoefficient is 10.0 in tests for some reason, but
// we need it to be 1.0.
return 1.0;
} else {
return (CGFloat)UIAnimationDragCoefficient();
}
#else
return 1.0;
#endif
}
@implementation REATransitionAnimation {
NSTimeInterval _delay;
}
+ (REATransitionAnimation *)transitionWithAnimation:(CAAnimation *)animation
layer:(CALayer *)layer
andKeyPath:(NSString*)keyPath;
{
REATransitionAnimation *anim = [REATransitionAnimation new];
anim.animation = animation;
anim.layer = layer;
anim.keyPath = keyPath;
return anim;
}
- (void)play
{
/*
CACurrentMediaTime introduces some kind of delay even if _delay is set to 0
it calls mach_absolute_time() which is based on the last time the device booted
which might cause the delay
*/
if (_delay > 0){
_animation.beginTime = CACurrentMediaTime() + _delay * SimAnimationDragCoefficient();
}
_animation.duration = self.duration * SimAnimationDragCoefficient();
[_layer addAnimation:_animation forKey:_keyPath];
}
- (void)delayBy:(CFTimeInterval)delay
{
if (delay <= 0) {
return;
}
_delay += delay;
}
- (CFTimeInterval)duration
{
if (_animation.duration == 0) {
return DEFAULT_DURATION;
}
return _animation.duration;
}
- (CFTimeInterval)finishTime
{
if (_animation.beginTime == 0) {
return CACurrentMediaTime() + self.duration + _delay;
}
return _animation.beginTime + self.duration + _delay;
}
@end