En plus de Brad Larson réponse: pour les couches (qui sont créés par vous), vous pouvez utiliser la délégation au lieu de modifier la couche d' actions
dictionnaire. Cette approche est plus dynamique et peut être plus performant. Et il permet de désactiver toutes les implicites des animations sans avoir à énumérer tous les animables clés.
Malheureusement, il est impossible d'utiliser UIView
s comme couche personnalisée délégués, parce que chaque UIView
est déjà un délégué de son propre calque. Mais vous pouvez utiliser une simple classe helper comme ceci:
@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
D'utilisation (à l'intérieur de la vue):
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
Parfois, il est pratique d'avoir une vue d'contrôleur en tant que délégué pour de la vue personnalisée sous-couches; dans ce cas, il n'est pas nécessaire pour une classe d'assistance, vous pouvez mettre en oeuvre actionForLayer:forKey:
droit de la méthode à l'intérieur du contrôleur.
Mais, s'il vous plaît, n'essayez pas de modifier le délégué de l' UIView
s'couche sous-jacente (par exemple, pour activer implicite animations) - les mauvaises choses qui se passera :)
Remarque: si vous souhaitez animer (pas de désactiver l'animation pour les) couche redessine, il est inutile de mettre des [CALayer setNeedsDisplayInRect:]
appel à l'intérieur d'un CATransaction
,, car la redéfinition peut (et probablement) se produit parfois plus tard. La bonne approche consiste à utiliser les propriétés personnalisées, comme décrit dans cette réponse.