Насколько я могу видеть, 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];
}];
Я не обязательно хочу использовать CABasicAnimation для этого, но не вижу действующей альтернативы. Если я использую настройки ограничения ширины и ширины на моем UIButton, я думаю, что это может просто изменить размер кадра кнопки (которая имеет чистый фон и не видна), а не сам текст. Это дало мне представление, хотя, я думаю, я мог бы просто изменить размер шрифта кнопки и оживить это. Немного взломать, но я попробую и отчитаю. –
Изменение размера шрифта не работает. Кнопка перемещается, когда она оживляет изменения. –