CATransformLayer не поддерживает неявную анимацию?

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

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 поддерживает неявную анимацию).

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

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

4 ответа

Решение

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

Если вы добавите слой и попытаетесь анимировать его в том же цикле выполнения, анимация не произойдет - она ​​произойдет мгновенно. Вам нужно обернуть, добавив слой в 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;

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

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

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

Другие вопросы по тегам