Skip to content

Instantly share code, notes, and snippets.

@lijon
Created September 28, 2015 07:38
Show Gist options
  • Save lijon/53b7cf640183ae4567c7 to your computer and use it in GitHub Desktop.
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.
@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