Я пытаюсь представить вид, заставляя его появляться из центра экрана, увеличиваясь до его полного размера, а также поворачивая его вокруг оси x в трехмерном режиме.Когда я создаю представление, я применяю к нему преобразование, чтобы убедиться, что оно сжато и повернуто, чтобы начать с него (оно настолько мало, что на самом деле его не видно), затем я пытаюсь использовать CATransform3D, например:
CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"transform"];
CATransform3D transform = CATransform3DRotate(view.layer.transform, M_PI, 1.0, 0, 0);
transform = CATransform3DScale(transform, 1000, 1000, 1000);
transform.m34 = 1.0 / 10000;
[anim setToValue:[NSValue valueWithCATransform3D:transform]];
[anim setDuration:0.75f];
anim.removedOnCompletion = NO;
anim.delegate = self;
[view.layer addAnimation:anim forKey:@"grow"];
Однако эта анимация не изменяет фактическое преобразование слоя, поэтому я также делаю это:
- (void)animationDidStop:(CAAnimation *)theAnimation finished:(BOOL)flag {
view.layer.transform = CATransform3DIdentity;
[view.layer removeAllAnimations];
}
, чтобы установить преобразование после остановки анимации.Однако это иногда приводит к заметному мерцанию в конце анимации.Я полагаю, что это потому, что анимация возвращает исходное преобразование в конце фазы анимации, и это происходит на мгновение, прежде чем вызывается процедура animationDidStop.Есть ли лучший способ сделать это?
Редактировать: включение его в анимацию UIView работает, так как таким образом вы можете установить преобразование напрямую:
view.layer.transform = CATransform3DScale(CATransform3DIdentity, 0.001, 0.001, 0.001);
view.layer.transform = CATransform3DRotate(view.layer.transform, M_PI, 1.0, 0.0, 0.0);
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.75];
[UIView setAnimationCurve:UIViewAnimationCurveEaseOut];
CATransform3D transform = CATransform3DRotate(view.layer.transform, M_PI, 1.0, 0, 0);
transform = CATransform3DScale(rotationTransform, 1000, 1000, 1000);
transform.m34 = 1.0 / -500;
view.layer.transform = transform;
[UIView commitAnimations];
Однако я все равно хотел быответьте на мой исходный запрос о том, как добиться того же успеха с помощью CAAnimation, так как это обеспечивает большую гибкость для анимаций в целом.
Edit2: кажется, ответ на мой исходный вопрос (как решить проблему сCAAnimation) было на самом деле очень просто.Чтобы сохранить конечное состояние (и убрать мерцание), мне просто нужно было добавить следующую строку:
anim.fillMode = kCAFillModeForwards;