Как заменить масштаб CGAffineTransform и альфа-анимацию с помощью CBasicAnimations и Auto Layout?

Насколько я понимаю, Apple хочет, чтобы мы ушли от анимации CGAffineTransform к анимации, используя:

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 раза длиннее, чем раньше, а анимация на устройстве стала заметно менее «плавной», чем раньше.

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

Заранее спасибо за ваш ответ.

РЕДАКТИРОВАТЬ: Кажется, это помогло сделать анимацию плавной, но я все еще чувствую, что код для этого мог бы быть намного более кратким.

[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];

}];

person Michael Campsall    schedule 27.08.2013    source источник


Ответы (1)


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

person rdelmar    schedule 27.08.2013
comment
Я не обязательно хочу использовать для этого CABasicAnimation, но не видел работающей альтернативы. Если я использую настройки ограничений высоты/ширины в моем UIButton, я думаю, что это может просто настроить размер рамки кнопки (которая имеет четкий фон и не видна), а не сам текст. Это дало мне идею, я думаю, я мог бы просто изменить размер шрифта кнопки и анимировать его. Немного взлома, но я попробую и отчитаюсь. - person Michael Campsall; 27.08.2013
comment
Изменение размера шрифта не работает. Кнопка перемещается, анимируя изменения. - person Michael Campsall; 27.08.2013