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