Created
September 28, 2015 07:38
-
-
Save lijon/53b7cf640183ae4567c7 to your computer and use it in GitHub Desktop.
Pause and save animations when app going into background, resume when going foreground.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@implementation CALayer (persist) | |
- (NSArray*)pauseAndSaveAnimations { | |
NSMutableArray *array = [NSMutableArray new]; | |
__unsafe_unretained __block void (^recurse2)(CALayer *); | |
void (^recurse)(CALayer *) = ^(CALayer *layer) { | |
for(NSString *key in layer.animationKeys) { | |
NSArray *a = @[layer,key,[[layer animationForKey:key] copy]]; | |
[array addObject:a]; | |
} | |
for(CALayer *sublayer in layer.sublayers) { | |
recurse2(sublayer); | |
} | |
}; | |
recurse2 = recurse; | |
recurse(self); | |
[self pauseAnimations]; | |
return array; | |
} | |
+ (void)resumeSavedAnimations:(NSArray *)anims { | |
CALayer *superLayer; | |
for(NSArray *a in anims) { | |
CALayer *layer = a[0]; | |
NSString *key = a[1]; | |
CAAnimation *anim = a[2]; | |
[layer addAnimation:anim forKey:key]; | |
if(!superLayer || ![superLayer.sublayers containsObject:layer]) { | |
superLayer = layer; | |
[superLayer resumeAnimations]; | |
} | |
} | |
} | |
- (void)pauseAnimations { | |
CFTimeInterval pausedTime = [self convertTime:CACurrentMediaTime() fromLayer:nil]; | |
self.speed = 0.0; | |
self.timeOffset = pausedTime; | |
} | |
- (void)resumeAnimations { | |
CFTimeInterval pausedTime = [self timeOffset]; | |
self.speed = 1.0; | |
self.timeOffset = 0.0; | |
self.beginTime = 0.0; | |
CFTimeInterval timeSincePause = [self convertTime:CACurrentMediaTime() fromLayer:nil] - pausedTime; | |
self.beginTime = timeSincePause; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment