2013-11-11 3 views
4

У меня есть UIView, я хочу анимировать его с вращением. Я тоже хочу использовать автозапуск. Я уже видел много общих вопросов stackoverflow, но я не нашел подходящего решения. Итак, давайте начнем с моего интерфейса и кода анимации; У меня есть UIView с изображением, которое должно быть повернуто. И прямо сейчас у меня есть кнопка, которая активирует поворот. На скриншоте вы можете увидеть красный крест, это должен быть центр вращения (прямо сейчас он находится на изображении, но я хочу сделать центр вращения за пределами повернутого UIView, я знаю, что это может быть архивировано с помощью AnchorPoint).Autolayout нарушает трансляцию вращения анимации

enter image description here

Это мой поворот код анимации:

#define ROTATE_DURATION 3.0 

- (IBAction)rotateArrow { 

CGAffineTransform transform = self.hand.transform; 

NSLog(@"layer possition before animation x: %f; y: %f",self.hand.layer.position.x,self.hand.layer.position.y); 

[UIView animateWithDuration:ROTATE_DURATION/3 delay:0.0 options:UIViewAnimationOptionCurveLinear animations:^{ 

     self.hand.transform = CGAffineTransformRotate(transform, 2*M_PI/3) ; 
     [self.hand layoutIfNeeded]; 

     NSLog(@"layer possition after animation 1 x: %f; y: %f",self.hand.layer.position.x,self.hand.layer.position.y); 
    } 
    completion:^(BOOL finished) { 
     [UIView animateWithDuration:ROTATE_DURATION/3 delay:0.0 options:UIViewAnimationOptionCurveLinear animations:^{ 

      self.hand.transform = CGAffineTransformRotate(transform, -2*M_PI/3) ; 
      [self.hand layoutIfNeeded]; 

      NSLog(@"layer possition after animation 2 x: %f; y: %f",self.hand.layer.position.x,self.hand.layer.position.y); 
     } 
    completion:^(BOOL finished) { 
     [UIView animateWithDuration:ROTATE_DURATION/3 delay:0.0 options:UIViewAnimationOptionCurveLinear animations:^{ 

      self.hand.transform = CGAffineTransformRotate(transform, 0) ; 
      [self.hand layoutIfNeeded]; 

      NSLog(@"layer possition after animation 3 x: %f; y: %f",self.hand.layer.position.x,self.hand.layer.position.y); 
     } 
     completion:^(BOOL finished) { 

     }]; 
    }]; 
}]; 



} 

Итак, в чем проблема: Когда вращение в прогресс UIView изменяет это center и layer.position собственность, поэтому мой UIView является «скачками "при анимации. Если автоотключение выключено, анимация в порядке. Я смотрел WWDC 2012 «Автоматический макет по примеру» и обнаружил, что я бы использовал [self.hand layoutIfNeeded]; все было бы прекрасно, но это совсем не так. Анимация стала немного более гладкой, но я вижу, что это «прыгает». Итак, вот мой «выход».

enter image description here

Когда это оживляющее, UIView идет направо, как вы можете видеть на изображении, и чем спина к нормальному положению. Как я могу исправить это «прыжки»?

Вот лог:

layer possition before animation x: 160.000000; y: 99.500000 
layer possition after animation 1 x: 197.349030; y: 114.309601 
layer possition after animation 2 x: 197.349030; y: 114.309601 
layer possition after animation 3 x: 160.000000; y: 99.500000 

Спасибо.

ответ

5

Когда я компоную свои взгляды, все начали работать нормально. Когда вы делаете преобразование, важно помнить, что автоматическая рассылка всегда вычисляет границы просмотров и фрейм, основываясь на установленных вами ограничениях. Таким образом, в моем случае я просто добавил вертикальное и горизонтальное выравнивание по центру, ширину и высоту к поворотному виду, поэтому механизм автоопределения знает, когда именно мой взгляд. И все идет отлично. Вот хороший учебник autolayout:

http://www.raywenderlich.com/50319/beginning-auto-layout-tutorial-in-ios-7-part-1

2

Возможно, вы столкнулись с general incompatibility between autolayout and transforms. Взгляните туда для получения более подробной информации, но рассказ о том, что вы, вероятно, не хотите использовать автозапуск на одном и том же представлении, которое трансформируется.

+0

Я не открывал ссылку еще, но я хочу сказать, что я должен «снять» ограничения из моего UIView, преобразовать его и затем добавить обратно ограничения? –

+1

Нет, я говорю, что у вас не должно быть никаких ограничений, связанных с вашим представлением, в то время как его преобразование не является преобразованием идентичности. –

+0

Хотя это не правильный ответ как таковой, он приводит к невероятно информативному сообщению об источнике проблемы. Очень полезно. Спасибо! –

1
  1. Решение создать вид контейнера, который использует автоматическую раскладку.
  2. Поворот (с примененным к нему преобразованием) должен использовать автоматическое изменение размера .
  3. Добавить поворот на вид контейнера.

Создание просмотров:

// Create container view 
{ 
    self.mContainerView = [[UIView alloc] init]; 
    self.mContainerView.translatesAutoresizingMaskIntoConstraints = NO; 
} 

// Create view who will have the transform 
{ 
    self.mRotateView = [UIButton buttonWithType:UIButtonTypeCustom]; 
    self.mRotateView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;   
     [self.mContainerView addSubview:self.mRotateView]; 
} 

Берите трансформируют:

{ 
    CGFloat lAngle = 180.0;  
    [UIView animateWithDuration:0.5 delay:0.0 options: UIViewAnimationOptionAllowUserInteraction |UIViewAnimationOptionCurveLinear animations:^{ 
      CGAffineTransform transform = CGAffineTransformMakeRotation(lAngle); 
      self.mRotateView.transform = transform; 
     } completion:NULL]; 
} 
Смежные вопросы