Подтвердить что ты не робот

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"];
4b9b3361

Ответ 1

Что такое bounds вашего слоя?

Я уверен, что он имеет нулевой размер; попробуйте установить его размер того же размера, что и ваша форма.

CAShapeLayer рисует форму как вид наложения, независимо от contentsbounds и 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));