CATransformLayer не поддерживает неявную анимацию? - PullRequest
5 голосов
/ 08 февраля 2011

Вот мой код анимации:

CGFloat zDistance = 850;
CGFloat scaleFactor = BACK_COVER_WIDTH / self.transformLayer.bounds.size.width;
CATransform3D rotation = CATransform3DMakeRotation(M_PI, 0.0, 1.0, 0.0);
CATransform3D scale = CATransform3DMakeScale(scaleFactor, scaleFactor, 0.0);
CATransform3D transform = CATransform3DConcat(rotation, scale);
transform.m34 = 1.0 / -zDistance;
CGPoint location = CGPointMake(CGRectGetMidX(self.layer.frame), CGRectGetMidY(self.layer.frame));
[CATransaction begin];
[CATransaction setAnimationDuration:1.0];
self.transformLayer.transform = transform;
self.transformLayer.position = location;
[CATransaction commit];

self.transformLayer - это CATransformLayer с двумя подслоями, один для передней и другой для задней (я создаю эффект "перевернуть"). Однако этот код просто устанавливает положение и трансформируется без анимации. Поэтому я подумал, что, возможно, transform не поддерживает неявную анимацию, поэтому я взял ее и просто попытался установить положение, но это тоже не анимировало (и я точно знаю, что position поддерживает неявную анимацию). 1008 *

Я что-то не так делаю или CATransformLayer просто не поддерживает неявную анимацию? Документация ничего не говорит о том, что она не поддерживает, поэтому я предполагаю, что это так.

РЕДАКТИРОВАТЬ: это для Mac OS X, а не iOS

Ответы [ 4 ]

1 голос
/ 18 марта 2011

Я просто использовал явную анимацию, но ответ Дэвида Дункана здесь кажется шагом в правильном направлении для всех, кто сталкивается с этой проблемой.

0 голосов
/ 14 февраля 2013

Если вы добавите слой и попытаетесь анимировать его в том же цикле выполнения, анимация не произойдет - она ​​произойдет мгновенно. Вам нужно обернуть, добавив слой в CATransaction. После этого вы можете явно или неявно анимировать. Например, это должно работать:

[CATransaction begin];
[self.view.layer addSublayer:transformLayer];
[CATransaction commit];

// implicit animation will now occur because we're in the next run loop
transformLayer.transform = newTransform;
0 голосов
/ 12 февраля 2011

Отображаются только подслои CATransformLayer.Поэтому я предполагаю, что его свойство transform никогда не применяется.Вы пробовали установить свойство sublayerTransform вместо этого?Похоже, это то, к чему ты идешь.

0 голосов
/ 08 февраля 2011

Неявная анимация отключена для всех слоев, связанных с UIView s.У меня есть гораздо более подробный ответ на другой вопрос, если вам интересно узнать подробности.Но вкратце, если вы хотите анимации на слое, связанном с видом, вам нужно сделать это явно (т.е. прикрепить CAAnimation объекты, используя -addAnimation:forKey:).

Редактировать : ЭтоОказывается, этот вопрос для OS X, а CATransformLayer на самом деле является подслой в любом случае.Пожалуйста, не обращайте внимания на этот ответ (хотя связанный ответ все еще полезен для iOS).

...