Повторять анимацию переменное количество раз
Мне было интересно, как я могу настроить анимацию для повторения. Количество повторений должно определяться переменной. В следующем коде переменная int newPage
должна определять, как часто повторяется анимация.
Я попробовал это, но анимация (которая использует анимацию блока) была выполнена только один раз:
for (int temp = 1; temp <= newPage; temp++) {
[self animatePage];
}
Если я закодирую следующее, он работает так, как я хочу, но это жестко запрограммировано (т.е. анимация будет повторяться дважды), и я не вижу способа изменить число способов, которыми часто это анимация выполненный в коде и согласно моей переменной newPage:
[UIView animateWithDuration:0
delay:0.1
options:UIViewAnimationOptionCurveEaseIn
animations:^{[self animatePage];}
completion:^(BOOL finished){[self animatePage];}];
Я был бы очень благодарен за предложения о том, как повторить одну и ту же анимацию, не требуя жесткого кодирования количества раз, когда я хочу, чтобы эта анимация повторялась.
EDIT:
Я попытался реализовать следующий код, но на самом деле будет выполняться только одна анимация:
[UIView animateWithDuration:0
delay:1
options:UIViewAnimationOptionCurveEaseIn
animations:^{
[UIView setAnimationRepeatCount:2];
[self animatePage];
}
completion:nil];
Ответы
Ответ 1
Имела ту же проблему - вам не хватало an'UIViewAnimationOptionRepeat '
Это должно работать:
[UIView animateWithDuration:0
delay:1
options:UIViewAnimationOptionCurveEaseIn | UIViewAnimationOptionRepeat
animations:^{
[UIView setAnimationRepeatCount:2]; // **This should appear in the beginning of the block**
[self animatePage];
}
completion:nil];
Сделал трюк для меня.
Ответ 2
Вы пытались установить repeatCount? + (void)setAnimationRepeatCount:(float)repeatCount
Я пробовал следующий блок кода, и он определенно повторяет 2x для меня (l был UITextView, который был увеличен на 2x в X dir и 3X в Y dir):
[UIView animateWithDuration:2
delay:0.1
options:UIViewAnimationOptionCurveEaseIn
animations:^{ [UIView setAnimationRepeatCount:2];
l.transform = CGAffineTransformMakeScale(2,3); } completion:nil];
Ответ 3
причина, по которой вы видите, но одна анимация заключается в том, что из-за того, что вы вызываете анимацию из цикла в той же runloop, переименование в последнем выигрыше вызова (одна анимация)
вместо вызова [self animatePage]
, попробуйте позвонить
[self performSelector:@selector(animatePage) withObject:nil afterDelay:.1 *temp];
это создаст ваши вызовы для отдельных потоков.
вам может понадобиться играть с интервалом задержки
Ответ 4
Чтобы избежать сбоев между анимациями, используйте ключевые кадры. Я написал расширение, которое работает со всем, что соответствует UIView (тонна визуальных элементов)
Свифт 4:
import UIKit
extension UIView{
func rotate(count: Float, _ complete: @escaping ()->()) {
UIView.animateKeyframes(withDuration: 1.0, delay: 0, options: [.repeat], animations: {
//to rotate infinitely, comment the next line
UIView.setAnimationRepeatCount(count)
//rotate the object to 180 degrees
UIView.addKeyframe(withRelativeStartTime: 0, relativeDuration: 0.5/1.0, animations: {
self.transform = CGAffineTransform(rotationAngle: (CGFloat(Double.pi)))
})
UIView.addKeyframe(withRelativeStartTime: 0, relativeDuration: 0.5/1.0, animations: {
//rotate the object from 180 to 360 degrees
self.transform = CGAffineTransform(rotationAngle: (CGFloat(Double.pi * 2)))
})
}, completion:{ _ in
complete()
})
}
}
Чтобы позвонить в любое место в приложении:
view.rotate() { /*do after*/ }