Core Animation基本アニメーション、マルチステップアニメーション、パスに沿ったアニメーション、時間関数、アニメーショングループ

4590 ワード

基本アニメーション
  • CABasicAnimationを使用して、アニメーション
  • を実現
    CABasicAnimation *animation = [CABasicAnimation animation];
    animation.keyPath = @"position.x";
    animation.fromValue = @77;
    animation.toValue = @455;
    animation.duration = 1;
    
    // rocket      ,  removedOnCompletion No         
    animation.fillMode = kCAFillModeForward;
    animation.removedOnCompletion = NO;
    
    [rocket.layer addAnimation:animation forKey:@"basic"];
    
  • のanimation.keyPathがサポートするキーパスの完全なリスト:https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/CoreAnimation_guide/Key-ValueCodingExtensions/Key-ValueCodingExtensions.html
  • アニメーションをより正確に制御する方法:http://ronnqvi.st/controlling-animation-timing/
  • fromValue、byValueとtoValueの組み合わせによって異なる効果が得られます.https://developer.apple.com/library/ios/documentation/GraphicsImaging/Reference/CABasicAnimation_class/Introduction/Introduction.html#//apple_ref/doc/uid/TP40004496-CH1-SW4
  • マルチステップアニメーション
  • CAKeyframeAnimationを使用して、アニメーション
  • を実現
    CAKeyframeAnimation *animation = [CAKeyframeAnimation animation];
    animation.keyPath = @"position.x";
    animation.values = @[ @0, @10, @-10, @10, @0 ];
    animation.keyTimes = @[ @0, @(1 / 6.0), @(3 / 6.0), @(5 / 6.0), @1 ];
    animation.duration = 0.4;
    
    animation.additive = YES;
    
    [form.layer addAnimation:animation forKey:@"shake"];
    
    パスに沿ったアニメーション
    CGRect boundingRect = CGRectMake(-150, -150, 300, 300);
    
    CAKeyframeAnimation *orbit = [CAKeyframeAnimation animation];
    orbit.keyPath = @"position";
    orbit.path = CFAutorelease(CGPathCreateWithEllipseInRect(boundingRect, NULL));
    orbit.duration = 4;
    orbit.additive = YES;
    orbit.repeatCount = HUGE_VALF;
    orbit.calculationMode = kCAAnimationPaced;
    orbit.rotationMode = kCAAnimationRotateAuto;
    
    [satellite.layer addAnimation:orbit forKey:@"orbit"];
    
    じかんかんすう
    CAMediaTimingFunction
  • time functionはeasing関数とも呼ばれ、最も簡単なeasing関数はlinearである.Core Animationでは、この機能はCAMediaTimingFunctionクラスによって表される
  • CABasicAnimation *animation = [CABasicAnimation animation];
    animation.keyPath = @"position.x";
    animation.fromValue = @50;
    animation.toValue = @150;
    animation.duration = 1;
    
    animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
    
    [rectangle.layer addAnimation:animation forKey:@"basic"];
    
    rectangle.layer.position = CGPointMake(150, 0);
    
    Core Animationにはlinear以外の内蔵easing関数がいくつか付属しています
  • Ease in (kCAMediaTimingFunctionEaseIn):
  • Ease out (kCAMediaTimingFunctionEaseOut):
  • Ease in ease out (kCAMediaTimingFunctionEaseInEaseOut):
  • デフォルト(kCAMediaTimingFunctionDefault):
  • +functionWithControlPoints:::::独自のeasing関数を作成する
    CABasicAnimation *animation = [CABasicAnimation animation];
    animation.keyPath = @"position.x";
    animation.fromValue = @77;
    animation.toValue = @455;
    animation.duration = 1;
    
    animation.timingFunction = [CAMediaTimingFunction functionWithControlPoints:0.5:0:0.9:0.7];
    
    [rocket.layer addAnimation:animation forKey:@"basic"];
    
    rocket.layer.position = CGPointMake(150, 0);
    
    アニメーショングループ
  • の複雑なアニメーションで、複数のアトリビュートをアニメートします.position,rotation,z-positionを同時にアニメーション化します.CAAnimationGroup
  • の使用
    CABasicAnimation *zPosition = [CABasicAnimation animation];
    zPosition.keyPath = @"zPosition";
    zPosition.fromValue = @-1;
    zPosition.toValue = @1;
    zPosition.duration = 1.2;
    
    CAKeyframeAnimation *rotation = [CAKeyframeAnimation animation];
    rotation.keyPath = @"transform.rotation";
    rotation.values = @[ @0, @0.14, @0 ];
    rotation.duration = 1.2;
    rotation.timingFunctions = @[
    [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut],
    [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]
    ];
    
    CAKeyframeAnimation *position = [CAKeyframeAnimation animation];
    position.keyPath = @"position";
    position.values = @[
    [NSValue valueWithCGPoint:CGPointZero],
    [NSValue valueWithCGPoint:CGPointMake(110, -20)],
    [NSValue valueWithCGPoint:CGPointZero]
    ];
    position.timingFunctions = @[
    [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut],
    [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]
    ];
    position.additive = YES;
    position.duration = 1.2;
    
    CAAnimationGroup *group = [[CAAnimationGroup alloc] init];
    group.animations = @[ zPosition, rotation, position ];
    group.duration = 1.2;
    group.beginTime = 0.5;
    
    [card.layer addAnimation:group forKey:@"shuffle"];
    
    card.layer.zPosition = 1;