西海岸より

つらつらざつざつと

layerのアニメーションを無効化する方法

UIView上で扱うlayerに対して、変更を加えた場合、自動でアニメーション(暗黙的なアニメーション)がかかってしまう。これを無効化する方法のメモ。

layer追加によるアニメーションを無効化

layerの上にlayerを追加した際に、自動的にアニメーションがかかるようになっており、それを無効化する方法。viewの親layerに対して、アニメーションを無効化した設定を反映させればよい。

NSMutableDictionary *newAction = [[NSMutableDictionary alloc] initWithObjectsAndKeys:
                                      [NSNull null],@"onOrderIn",
                                      [NSNull null],@"onOrderOut",
                                      [NSNull null],@"sublayers",
                                      [NSNull null],@"bounds",
                                      [NSNumber numberWithInt:5],@"duration",
                                      nil];
view.layer.actions = newAction;

これで、view.layerに対して、layerを追加した際のアニメーションは無くなる。(参考↓)

[view.layer addSublayer:theLayer]

layerにCGImageをセットする際のアニメーションを無効化

layerにCGImageRefをセットする際も自動でアニメーションが行われる。これを無効化するには、CATransationで囲み、kCATransactionAnimationDurationでアニメーション時間を0に設定することでアニメーションしなくなる。

[CATransaction begin];
[CATransaction setValue:[NSNumber numberWithFloat:0.0f] forKey:kCATransactionAnimationDuration];
theLayer.contents = (id)imgRef;
[CATransaction commit];

上記2つを気をつければ、layerをかなり扱いやすくなる。