2013-08-27 3 views
1

Насколько я могу видеть, Apple хочет, чтобы отойти от CGAffineTransform анимации и в анимацию с помощью:Как заменить масштаб CGAffineTransform и альфа-анимацию с помощью CABasicAnimations и Auto Layout?

myView.layoutConstraint.constant = someNewValue; 

[myView layoutIfNeeded]; 

для анимации, которые включают перевод вида.

Также кажется, что теперь мы должны использовать анимацию CABasicAnimation для масштабирования и вращения (а иногда и непрозрачности), потому что она анимирует слой вида, а не вид, и при этом отлично играет с автомаршрутом.

Я использовал следующий код, чтобы применить непрозрачности и масштаб анимации, которая работала прекрасно:

[UIView animateWithDuration:0.1f animations:^{ 
//  first animation 
self.myMeButton.alpha = 1; 
self.myMeButton.transform = CGAffineTransformMakeScale(1.1, 1.1); 

} completion:^(BOOL finished) { 
    [UIView animateWithDuration:0.2f animations:^{ 
     //  second animation 
     self.myButton.transform = CGAffineTransformMakeScale(1, 1); 
    }]; 
}]; 

конечно же Автокомпоновка играет хаос с масштабом анимации, и поэтому я пытаюсь найти альтернативный способ сделать это , До сих пор, я пришел с этим:

[CATransaction begin]; { 
    [CATransaction setCompletionBlock:^{ 
     //   code for when animation completes 
     self.pickMeButton.alpha = 1; 

     CABasicAnimation *scaleDown = [CABasicAnimation animationWithKeyPath:@"scale"]; 
     scaleDown.fromValue = [NSValue valueWithCATransform3D:CATransform3DMakeScale(1.1, 1.1, 1)]; 
     scaleDown.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeScale(1, 1, 1)]; 
     scaleDown.duration = 0.1; 

     [self.myButton.layer addAnimation:scaleDown forKey:nil]; 

    }]; 
    // describe animations: 
    CABasicAnimation* scaleUp = [CABasicAnimation animationWithKeyPath:@"scale"]; 
    scaleUp.autoreverses = NO; 
    scaleUp.fromValue = [NSValue valueWithCATransform3D:CATransform3DMakeScale(1, 1, 1)]; 
    scaleUp.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeScale(1.1, 1.1, 1)]; 

    CABasicAnimation *fadeAnim = [CABasicAnimation animationWithKeyPath:@"opacity"]; 
    fadeAnim.fromValue=[NSNumber numberWithDouble:0.0]; 
    fadeAnim.toValue=[NSNumber numberWithDouble:1.0]; 

    // Customization for all animations: 
    CAAnimationGroup *group = [CAAnimationGroup animation]; 
    group.duration = 0.2f; 
    group.repeatCount = 1; 
    group.autoreverses = NO; 
    group.animations = @[scaleUp, fadeAnim]; 

    // add animations to the view's layer: 
    [self.myButton.layer addAnimation:group forKey:@"allMyAnimations"]; 


} [CATransaction commit]; 

Как вы можете увидеть код почти в 3 раза до тех пор, как раньше, и анимация на устройстве заметно меньше «гладко», чем это было ранее.

Есть ли способ сделать это лучше?

Заранее благодарим за ваш ответ.

EDIT: Это, похоже, сделало трюк в том, что анимация гладкая, но я все еще чувствую, что код для этого может быть намного более кратким.

[UIView animateWithDuration:0.2f animations:^{ 

    self.pickMeButton.alpha = 1; 

    CABasicAnimation* scaleUp = [CABasicAnimation animationWithKeyPath:@"transform"]; 
    scaleUp.duration = 0.2; 
    scaleUp.fromValue = [NSValue valueWithCATransform3D:CATransform3DMakeScale(0.1, 0.1, 1)]; 
    scaleUp.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeScale(1.2, 1.2, 1)]; 
    [self.pickMeButton.layer addAnimation:scaleUp forKey:nil]; 

}completion:^(BOOL finished) { 

    CABasicAnimation* scaleDown = [CABasicAnimation animationWithKeyPath:@"transform"]; 
    scaleDown.duration = 0.1; 
    scaleDown.fromValue = [NSValue valueWithCATransform3D:CATransform3DMakeScale(1.2, 1.2, 1)]; 
    scaleDown.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeScale(1, 1, 1)]; 
    [self.pickMeButton.layer addAnimation:scaleDown forKey:nil]; 

}]; 

ответ

2

Я не знаю, почему вы хотите сделать это с помощью CABasicAnimation для шкалы. Вы можете сделать это, как вы упомянули в начале своего вопроса. Установите новое значение для значений константы ограничения ширины и высоты представления, а затем используйте [myView layoutIfNeeded] внутри animateWithDuration. Если представление не имеет ограничений по высоте и ширине, но имеет константы в верхнем и нижнем и/или левом и правом краях супервизора, измените эти значения.

+0

Я не обязательно хочу использовать CABasicAnimation для этого, но не вижу действующей альтернативы. Если я использую настройки ограничения ширины и ширины на моем UIButton, я думаю, что это может просто изменить размер кадра кнопки (которая имеет чистый фон и не видна), а не сам текст. Это дало мне представление, хотя, я думаю, я мог бы просто изменить размер шрифта кнопки и оживить это. Немного взломать, но я попробую и отчитаю. –

+0

Изменение размера шрифта не работает. Кнопка перемещается, когда она оживляет изменения. –

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

  • Нет связанных вопросов^_^