Как масштабировать и вращать вид в одной анимации - PullRequest
4 голосов
/ 18 февраля 2012

Я пытаюсь представить вид, заставляя его появляться из центра экрана, увеличиваясь до его полного размера, а также поворачивая его вокруг оси 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;

Ответы [ 3 ]

0 голосов
/ 18 февраля 2012

Я знаю, что это не простой и короткий ответ, на который вы, вероятно, надеялись:)

Но здесь ( Учебное пособие по анимации UIView: Практические рецепты ) вы можете найти загружаемый пример, который такжепоказывает, как сделать масштабирование и поворот.

Вы можете увидеть масштаб и поворот, если вы запустите пример, нажмите HUD, а затем нажмите стоп.

0 голосов
/ 09 марта 2014

См. Эту ветку о том, как магазин приложений iPad вращается и масштабируется для ответа и кода: Как я могу перевернуть и увеличить UIView одновременно с iOS 7 iPad App Store?

0 голосов
/ 18 февраля 2012

Это может помочь вам:

  animationView.layer.anchorPoint = CGPointMake(0.0f, 0.0f);

  animationView.center = CGPointMake(0, 
                                  (animationView.center.y - 
                                   (animationView.bounds.size.height/2.0f)));

  // start the Page Open
  [UIView beginAnimations:@"Animation" context:nil];
  [UIView setAnimationDuration:2.0];     
  // set angle as per requirement
  [animationView.layer setValue:[NSNumber numberWithInt:180] 
                  forKeyPath:@"transform.rotation.x"];

  [UIView commitAnimations];
...