2014-03-05 4 views
0

Я пытаюсь перейти с одного взгляда на другой. Я знаю, что есть «[UIView transitionWithView ...», но я собираюсь добавить более сложные вещи к слою анимации и должен сам написать код.Основная анимация: Flipp a view

ниже код работает, но есть три проблемы:

  1. Когда появится вид обратной стороны, это перевернутый горизонтальный.

  2. После завершения анимации я добавляю вид сзади и удаляю фронт. Во время анимации оба представления становятся немного больше из-за перспективы (m34), поэтому, когда CompletionBlock добавляет новое представление на экран, есть уродливая привязка к первоначальному размеру.

  3. Мне нужно задержать CATransaction с блоком (runBlockAfterDelay). Если у меня нет блока, анимация не будет работать.

Заранее спасибо

Для дополнительного кредита :), можно ли иметь код в метод класса? например, + (void) flippFromView ...

- (void)flipFromView:(UIView *)fromView toView:(UIView *)toView spaceBetweenLayers:  (CGFloat)spaceBetweenLayers duration:(CGFloat)duration delay:(CGFloat)delay (void))block 
    { 
    // Move flipp view back, behind front view 
    toView.layer.transform = CATransform3DMakeTranslation(0.0, 0.0, -spaceBetweenLayers);; 

    // Layer that will handle the animation 
    CALayer *rootLayer = [CALayer layer]; 
    rootLayer.frame = self.frame; 
    rootLayer.position = fromView.layer.position; 
    [self.layer addSublayer:rootLayer]; 

    //Transform Layer 
    CATransformLayer *transformLayer = [CATransformLayer layer]; 
    [transformLayer addSublayer:fromView.layer]; 
    [transformLayer addSublayer:toView.layer]; 
    [rootLayer addSublayer:transformLayer]; 


    [self runBlockAfterDelay:delay block:^{ 

     [CATransaction begin]; 
     [CATransaction setValue:@(duration) forKey:kCATransactionAnimationDuration]; 

     // Completion block 
     [CATransaction setCompletionBlock:^{ 

      // App crashes with EXC_BAD_ACCESS if we don't move the layer back to the super layer before removing the rootLayer 
      [self.layer addSublayer:fromView.layer]; 
      [self.layer addSublayer:toView.layer]; 

      // Add new, and remove old layer 
      [self addSubview:toView]; 
      [fromView removeFromSuperview]; 

      // Set Z position 
      fromView.layer.zPosition = -10; 
      toView.layer.zPosition = 10; 

      // Clean up 
      [rootLayer removeFromSuperlayer]; 
     }]; 

     // Flipp 
     CATransform3D flippTransform = CATransform3DMakeRotation(DegreesToRadians(180), 0, 1, 0); 
     flippTransform.m34 = 1.0f/500.0f; 
     rootLayer.sublayerTransform = flippTransform; 

     [CATransaction commit]; 
    }]; 
} 
+0

вы должны принять ответ, если это вам помогло? – Paul

ответ

3

Он перемещается горизонтально, потому что это то, что вы только что сделали. Вы просто перевернули представление на 180 градусов.

Способ обойти это, чтобы сделать анимацию поэтапно.

  1. Анимируйте представление, чтобы перевернуть его на 90 градусов (вправо для этого примера), чтобы он был плоским на экране и невидимым.
  2. Поменяйте «вид спереди» на «задний» вид.
  3. Теперь измените преобразование на вид, чтобы оно перевернулось на 90 градусов влево. Не анимируйте это, просто измените его.
  4. Теперь анимируйте представление, чтобы вернуть его в нормальное русло.

Похоже, что вид повернулся на 180 градусов, но на самом деле он совсем не изменился в конце анимации. Похоже, он изменился.

Смежные вопросы