Brad Larsonの回答に加えて:(自分で作成した)カスタムレイヤーの場合は、レイヤーのactions
辞書を変更する代わりに委任を使用できます。このアプローチはより動的であり、パフォーマンスが向上する可能性があります。また、アニメート可能なキーをすべてリストしなくても、すべての暗黙的なアニメーションを無効にすることができます。
残念ながら、UIView
sをカスタムレイヤーデリゲートとして使用することは不可能です。それぞれUIView
が既に独自のレイヤーのデリゲートになっているためです。ただし、次のような単純なヘルパークラスを使用できます。
@interface MyLayerDelegate : NSObject
@property (nonatomic, assign) BOOL disableImplicitAnimations;
@end
@implementation MyLayerDelegate
- (id<CAAction>)actionForLayer:(CALayer *)layer forKey:(NSString *)event
{
if (self.disableImplicitAnimations)
return (id)[NSNull null]; // disable all implicit animations
else return nil; // allow implicit animations
// you can also test specific key names; for example, to disable bounds animation:
// if ([event isEqualToString:@"bounds"]) return (id)[NSNull null];
}
@end
使用法(ビュー内):
MyLayerDelegate *delegate = [[MyLayerDelegate alloc] init];
// assign to a strong property, because CALayer's "delegate" property is weak
self.myLayerDelegate = delegate;
self.myLayer = [CALayer layer];
self.myLayer.delegate = delegate;
// ...
self.myLayerDelegate.disableImplicitAnimations = YES;
self.myLayer.position = (CGPoint){.x = 10, .y = 42}; // will not animate
// ...
self.myLayerDelegate.disableImplicitAnimations = NO;
self.myLayer.position = (CGPoint){.x = 0, .y = 0}; // will animate
ビューのコントローラーをビューのカスタムサブレイヤーのデリゲートとして持つと便利な場合があります。この場合、ヘルパークラスは必要ありません。実装できます。actionForLayer:forKey:
。コントローラ内でメソッド。
重要な注意:のデリゲートを変更しようとしないでください UIView
の基になるレイヤーの(たとえば、暗黙的なアニメーションを有効にするなど)—悪いことが起こります:)
注:レイヤーの再描画をアニメーション化する(アニメーションを無効にしない)場合、実際の再描画が後で発生する可能性があるため(おそらくそうなる可能性があるため)、[CALayer setNeedsDisplayInRect:]
呼び出しを内に配置しても意味がCATransaction
ありません。この回答で説明されているように、カスタムプロパティを使用することをお勧めします。
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delay * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ });