CALayer - CABasicAnimation не масштабируется вокруг центра/anchorPoint
Используя приведенный ниже код, я пытаюсь заставить мой CALayer масштабироваться вокруг его центра, но он масштабируется по левому/верхнему (0,0). Я увидел этот вопрос: Якорная точка в CALayer и попытался установить anchorPoint - но это было [.5,.5], прежде чем я его установил, и настройка не имеет значения. Также попытался установить contentsGravity
.
Устанавливается, что у меня есть CAShapeLayer
, добавленный в self.view.layer
. Я рисую в нем некоторый рисунок, а затем добавляю CABasicAnimation. Анимация работает нормально - но она масштабируется в направлении вверх/влево, а не в центре представления.
Я занимался этим несколько часов - это должно быть что-то простое, но я не понимаю.
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"];
Ответы
Ответ 1
Что такое bounds
вашего слоя?
Я уверен, что он имеет нулевой размер; попробуйте установить его размер того же размера, что и ваша форма.
CAShapeLayer
рисует форму как вид наложения, независимо от contents
(и bounds
и contentsGravity
и т.д.), которые вы использовали бы в обычном CALayer
. Это может быть немного запутанным.
Ответ 2
Также убедитесь, что вы добавляете анимацию после создания представления. Если вы пытаетесь добавить анимацию в viewDidLoad, она, вероятно, не сработает. Попробуйте добавить его вместо viewDidAppear.
Я знаю только Swift, но вот пример:
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")
}
Ответ 3
Я потратил часы, чтобы узнать, как это сделать в соответствии с центром, но не смог найти решения для OSX. Я решил переместить слой, используя CATransform3DMakeTranslation, и объединить оба преобразования.
Мой код:
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));