Как отменить анимацию на основе блоков UIView?
Я искал множество SO вещей и в ссылках Apple, но все еще не могу справиться с моей проблемой.
что у меня есть:
- экран с 2 UIImageViews nad связан с ними 2 UIButtons
- 2 вида анимации:
2.1. сначала масштабируется вверх, затем вниз каждое из изображений, одно за другим, только один раз в viewDidLoad 2.2. во-вторых, при нажатии кнопки (которая является пользовательской кнопкой, скрытой "внутри" каждого UIImageView) она запускает анимацию соответствующего UIImageView-только один, а не оба - (также масштабируется вверх, затем вниз). - как я пишу для iOS4+ мне сказали, чтобы использовать блок на основе анимации!
что нужно:
Как отменить запуск анимации? Мне удалось отменить все, кроме последнего... :/ Вот мой фрагмент кода:
[UIImageView animateWithDuration:2.0
delay:0.1
options:UIViewAnimationOptionAllowUserInteraction
animations:^{
isAnimating = YES;
self.bigLetter.transform = CGAffineTransformScale(self.bigLetter.transform, 2.0, 2.0);
} completion:^(BOOL finished){
if(! finished) return;
[UIImageView animateWithDuration:2.0
delay:0.0
options:UIViewAnimationOptionAllowUserInteraction
animations:^{
self.bigLetter.transform = CGAffineTransformScale(self.bigLetter.transform, 0.5, 0.5);
} completion:^(BOOL finished){
if(! finished) return;
[UIImageView animateWithDuration:2.0
delay:0.0
options:UIViewAnimationOptionAllowUserInteraction
animations:^{
self.smallLetter.transform = CGAffineTransformScale(self.smallLetter.transform, 2.0, 2.0);
} completion:^(BOOL finished){
if(! finished) return;
[UIImageView animateWithDuration:2.0
delay:0.0
options:UIViewAnimationOptionAllowUserInteraction
animations:^{
self.smallLetter.transform = CGAffineTransformScale(self.smallLetter.transform, 0.5, 0.5);
}
completion:^(BOOL finished){
if (!finished) return;
//block letter buttons
[self.bigLetterButton setUserInteractionEnabled:YES];
[self.smallLetterButton setUserInteractionEnabled:YES];
//NSLog(@"vieDidLoad animations finished");
}];
}];
}];
}];
Как-то smallLetter UIImageView не работает должным образом, потому что при нажатии (через кнопку) bigLetter отменяет анимацию правильно... заранее спасибо:)
EDIT: Я использовал это решение, но до сих пор возникают проблемы с масштабированием smallLetter UIImageView - не отменяя вообще... решение
EDIT2: я добавил Это в начале методов next/prev:
- (void)stopAnimation:(UIImageView*)source {
[UIView animateWithDuration:0.01
delay:0.0
options:(UIViewAnimationOptionBeginFromCurrentState | UIViewAnimationOptionAllowUserInteraction)
animations:^ {
source.transform = CGAffineTransformIdentity;
}
completion:NULL
];
}
проблема остается... :/ не знаю, как прервать последнюю анимацию для букв в цепочке анимация
3 ответа:
вы можете остановить все анимации на просмотр по телефону:
[view.layer removeAllAnimations];
(вам нужно будет импортировать структуру QuartzCore для вызова методов в представлении.слой.)
Если вы хотите остановить определенную анимацию, а не все анимации, лучше всего использовать CAAnimations явно, а не вспомогательные методы анимации UIView, тогда у вас будет более детальный контроль и вы можете остановить анимацию явно по имени.
документация по анимации ядра Apple может быть найдено здесь:
для iOS 10 используйте uiviewpropertyanimator для анимации. Он предоставляет методы для запуска, остановки и приостановки анимации UIView.
let animator = UIViewPropertyAnimator(duration: 2.0, curve: .easeOut){ self.view.alpha = 0.0 } // Call this to start animation. animator.startAnimation() // Call this to stop animation. animator.stopAnimation(true)
Я бы добавил к ответу Ника, что сделать removeAllAnimations гладкой следующая идея будет очень удобно.
[view.layer removeAllAnimations]; [UIView transitionWithView:self.redView duration:1.0f options:UIViewAnimationOptionTransitionCrossDissolve animations:^{ [view.layer displayIfNeeded]; } completion:nil];