Подтвердить что ты не робот

Повторять анимацию переменное количество раз

Мне было интересно, как я могу настроить анимацию для повторения. Количество повторений должно определяться переменной. В следующем коде переменная 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];
4b9b3361

Ответ 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*/ }