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;
Неявные анимации отключены для всех слоев, связанных с UIView
s. У меня есть гораздо более подробный ответ на другой вопрос, если вам интересно узнать подробности. Но вкратце, если вы хотите анимации на слое, связанном с видом, вам нужно сделать это явно (т.е. прикрепить CAAnimation
объекты, использующие -addAnimation:forKey:
).
Изменить: Оказывается, этот вопрос для OS X, и CATransformLayer на самом деле является подслой в любом случае. Пожалуйста, не обращайте внимания на этот ответ (хотя связанный ответ все еще полезен для iOS).
Только подслои CATransformLayer
оказываются. Так что я думаю, что его transform
собственность никогда не применяется. Вы пытались установить sublayerTransform
собственность вместо? Похоже, это то, что вы собираетесь в любом случае.