CALayer – CABasicAnimation pas mise à l'échelle autour center / anchorPoint

En utilisant le code ci-dessous, j'ai essayé de faire évoluer mon CALayer autour de son centre – mais il s'échelonne de gauche / haut (0,0). J'ai vu cette question: Point d'ancrage dans CALayer et j'ai essayé de définir le point d'ancrage – mais c'était [.5, .5] avant de le définir et le réglage ne fait aucune différence. Également essayé le réglage du contentsGravity .

La mise en place est que j'ai un CAShapeLayer ajouté à self.view.layer Je fais un peu de dessin dedans, puis j'ajoute le CABasicAnimation. L'animation fonctionne bien – mais elle évolue vers le haut / la gauche – et non le centre de la vue.

J'ai bricolé avec ça pendant quelques heures – ça doit être quelque chose de simple mais je ne comprends pas.

 shapeLayer.anchorPoint = CGPointMake(.5,.5); shapeLayer.contentsGravity = @"center"; printf("anchorPoint %f %f\n", shapeLayer.anchorPoint.x, shapeLayer.anchorPoint.y); CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform.scale"]; animation.fromValue = [NSValue valueWithCATransform3D:CATransform3DIdentity]; animation.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeScale(0.1, 0.1, 1.0)]; [animation setDuration:1.0]; animation.fillMode=kCAFillModeForwards; animation.removedOnCompletion=NO; [shapeLayer addAnimation:animation forKey:@"zoom"]; 

Quelles sont les bounds de votre couche?

Je parie qu'il a une taille nulle; essayez de définir sa taille à la même taille que votre forme.

CAShapeLayer dessine la forme comme une sorte de superposition, indépendante du contents (et des bounds et contentsGravity et etc.) que vous utiliseriez dans un CALayer ordinaire. Cela peut être un peu déroutant.

Assurez-vous également que vous ajoutez l'animation après la création de la vue. Si vous essayez d'append une animation dans viewDidLoad, cela ne fonctionnera probablement pas. Essayez de l'append à viewDidAppear à la place.

Je ne connais que Swift, mais voici un exemple:

 override func viewDidAppear (animated: Bool) { addPulsation(yourButton) } func addPulsation (button: UIButton) { let scaleAnimation:CABasicAnimation = CABasicAnimation(keyPath: "transform.scale") scaleAnimation.duration = 1.0 scaleAnimation.repeatCount = 100 scaleAnimation.autoreverses = true scaleAnimation.fromValue = 1.05; scaleAnimation.toValue = 0.95; button.layer.addAnimation(scaleAnimation, forKey: "scale") } 

J'ai passé des heures à find comment le faire selon le centre, mais je n'ai pas trouvé de solution pour OSX. J'ai décidé de déplacer la couche en utilisant CATransform3DMakeTranslation et de combiner les deux transformations.

Mon code:

 NSView *viewToTransform = self.view; [viewToTransform setWantsLayer:YES]; viewToTransform.layer.sublayerTransform = CATransform3DConcat(CATransform3DMakeScale(-1.0f, -1.0f, 1.0f), CATransform3DMakeTranslation(viewToTransform.bounds.size.width, viewToTransform.bounds.size.height, 0));