Adobe AfterEffectsと連携して、凄いアニメーションをiOSアプリに移植する

by mixiappwchr


昨今iOSアプリケーション開発において、かっこよかったり気持ちのいいアニメーション、が目立つアプリが増えてきました。

ただ、愚直にアニメーションをiOS側で実装するとえらく大変です。。

以前こちらの記事でも書いたのですが、動画で先にアニメーションを作り、それをiOS側で利用するという手法を紹介したのですが具体的な利用の仕方を紹介します。

[DeNA中の人が事例で語る、アニメーションやデザインのアプリを効率よく開発するためのTips #iOS](https://codeiq.jp/magazine/2014/05/10760/)
 

#After Effectsからアニメーション用の素材を出力する
アニメーション自体の作り方は割愛します。 After Effects側ですごいアニメーションが作成できたら

レンダーキューを追加を選択して、動画の書き出しを設定します。
![スクリーンショット 2014-07-14 10.22.37_120.png](https://qiita-image-store.s3.amazonaws.com/0/37731/e9cae85b-6671-d407-6cb9-53667f7efec9.png)

出力設定のオプションを開きます。
![スクリーンショット 2014-07-14 10.22.51_120.png](https://qiita-image-store.s3.amazonaws.com/0/37731/d50baabb-5428-a076-1beb-6a410329023b.png)


 ![スクリーンショット 2014-07-14 10.23.06_120.png](https://qiita-image-store.s3.amazonaws.com/0/37731/acfc930e-85bd-ca76-d2e9-c0f50526e069.png)

様々な形式に書き出すことができるのですが、今回は動画を連続した静止画で書き出します。

![スクリーンショット 2014-07-14 10.23.18_120.png](https://qiita-image-store.s3.amazonaws.com/0/37731/e58c5f15-a66f-5e16-1f6e-652c16ecd751.png)
あとはレンダリングすれば以下のようなファイル群が書き出されるはずです。


![スクリーンショット 2014-07-14 10.23.41_120.png](https://qiita-image-store.s3.amazonaws.com/0/37731/c773d7ed-75b8-2a5b-5943-8bea67101294.png)


#iOS側でアニメーションを実装する

以下のようにCAKeyFrameAnimationを用います。

```objc
-(void)viewDidAppear:(BOOL)animated{
    [super viewDidAppear:animated];

    // animationのセットアップ
    self.splashLayer =  [self createSplashLayer:@"splash_%05d"  frameNumber:130 frameRate:30];
    [self.splashContainer.layer addSublayer:self.splashLayer];

    
   

}

// animation layerの生成
-(CALayer*)createSplashLayer:(NSString*)baseformat frameNumber:(NSInteger)frameNumber frameRate:(float)frameRate{
    CALayer *splashLayer = [CALayer layer];
    splashLayer.frame = CGRectMake(0,0,200,200);
    
    CAKeyframeAnimation *animation = [CAKeyframeAnimation animation];
    animation.keyPath = @"contents";
    animation.duration = frameNumber/frameRate;
    animation.removedOnCompletion = NO;
    NSMutableArray *timing = [[NSMutableArray alloc] init];
    
    NSMutableArray *images = [[NSMutableArray alloc] init];
    for(int i = 0;i <= frameNumber;i++){
        NSString *path= [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:baseformat,i] ofType:@"png"];
        UIImage *image= [[UIImage alloc] initWithContentsOfFile:path];
        [images addObject:(id)image.CGImage];
        [timing addObject:[NSNumber numberWithFloat:(float)i/frameNumber]];
    }
    
    animation.keyTimes = timing;
    animation.values = images;
    animation.calculationMode = kCAAnimationDiscrete;
    animation.repeatCount = 1;
    animation.fillMode = kCAFillModeForwards;
    animation.delegate = self;
    
    [splashLayer addAnimation:animation forKey:@"splash"];
    return splashLayer;
  

}

- (void)animationDidStop:(CAAnimation *)animation  finished:(BOOL)flag
{
    if(animation == [self.splashLayer animationForKey:@"splash"]){
       // アニメーション後に何か処理を連携したい場合はこちらに記述
        
    }
}
```

とこれだけでAfter Effects側で作成したアニメーションをiOS側に移植できます。

注意点として、動画サイズが大きいとメモリーを非常に食ってしまうので、一気に読み込まず、順々に表示するなど、もう少し調整処理が必要です。
 
 
この紹介したkeyframeanimationで表示する以外にも、After Effectsで作成した動画を直接AVPlayerなので再生するのもよいかと思っています。

やはり専用のアプリケーションを使って作成したアニメーションの方が遥かに工数がかからずアウトプットも品質が高い物がつくれます。
 
 これを使ってスプラッシュアニメーションを実装したサンプルプロジェクトをおいてますので、興味がある方は触ってみてください。
 
 
 https://github.com/nyankichi820/YahooDenaStudy-ios.git