重复动画可变次数

时间:2011-04-28 18:13:20

标签: iphone objective-c cocoa-touch animation

我想知道如何设置动画重复。重复次数需要由变量确定。在以下代码中,变量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];}];

我非常感谢有关如何重复相同动画的建议,而无需硬编码我希望重复此动画的次数。


编辑:

我尝试实现以下代码,但实际上只会执行一个动画:

        [UIView animateWithDuration:0
                          delay:1
                        options:UIViewAnimationOptionCurveEaseIn
                     animations:^{

                         [UIView setAnimationRepeatCount:2];
                         [self animatePage];

                     }
                     completion:nil];

4 个答案:

答案 0 :(得分:31)

有同样的问题 - 你错过了一个'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];

为我做了诀窍。

答案 1 :(得分:8)

您是否尝试设置了repeatCount? + (void)setAnimationRepeatCount:(float)repeatCount

我已经尝试了以下代码块,它肯定会为我重复2x(我是一个UITextView,在X dir中放大2倍,在Y dir放大3倍):

[UIView animateWithDuration:2 
delay:0.1 
options:UIViewAnimationOptionCurveEaseIn 
animations:^{ [UIView setAnimationRepeatCount:2]; 
l.transform = CGAffineTransformMakeScale(2,3); } completion:nil];

答案 2 :(得分:2)

你没有看到的原因,但是一个动画是由于你从同一个runloop中的循环调用动画,在最后一次调用获胜(一个动画)中重新启动

而不是调用[self animatePage],请尝试调用

[self performSelector:@selector(animatePage) withObject:nil afterDelay:.1 *temp];

这将在不同的线程上创建您的调用。

您可能需要使用延迟间隔

答案 3 :(得分:0)

为避免动画之间出现打cup,请使用关键帧。我编写了一个扩展程序,该扩展程序适用于所有符合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*/ }