我正在使用从另一个answer here获取的代码,但基本上是我正在使用的代码。这个问题的主要问题是,当我调用它时,需要15秒才能启动,然后需要15秒才能完成每个动画。 我希望它立即开始!我在这里缺少什么?
使用
调用-(void)viewDidLoad {
[self animationLoop: nil finished:nil context:nil];
}
功能
-(void)animationLoop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context {
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:15];
int padding = _Circle1Container.frame.size.width / 2;
// Circle 1
CGFloat x = (CGFloat) (arc4random() % (int) self.view.bounds.size.width + padding);
CGFloat y = (CGFloat) (arc4random() % (int) self.view.bounds.size.height + padding);
CGPoint squarePostion = CGPointMake(x, y);
_Circle1Container.center = squarePostion;
[UIView setAnimationDelegate:self]; // as suggested by @Carl Veazey in a comment
[UIView setAnimationDidStopSelector:@selector(animationLoop:finished:context:)];
[UIView commitAnimations];
}
答案 0 :(得分:2)
首先,您应该将_Circle1Container
重命名为_circle1Container
,因为大写字母通常会保留给Class
个名称。
其次,使用动画块来执行动画,因为它们更容易阅读,并且工作得更好。类似的东西:
int padding = _circle1Container.frame.size.width / 2;
// Circle 1
CGFloat x = (CGFloat) (arc4random() % (int) self.view.bounds.size.width + padding);
CGFloat y = (CGFloat) (arc4random() % (int) self.view.bounds.size.height + padding);
[UIView animateWithDuration:15.0f
delay:0.0f
options:UIViewAnimationOptionCurveLinear
animations:^{
_circle1Container.center = CGPointMake(x, y);
}
completion:^(BOOL finished){
// Fire a completion method here!
}];
这样,你也不需要传递所有其他参数。
最后,我不确定您要使用padding
变量尝试实现的目标。您生成的范围是[padding, width+padding]
和[padding, height+padding]
。在我看来,您需要[padding, width-padding]
和[padding, height-padding]
。如果是这种情况,只需尝试:
#define CLAMP(X, A, B) ((X < A) ? A : ((X > B) ? B : X))
CGFloat x = (CGFloat) (arc4random() % ((int)self.view.bounds.size.width));
CGFloat y = (CGFloat) (arc4random() % ((int)self.view.bounds.size.height));
x = CLAMP(x, (CGFloat)padding, (CGFloat)(self.view.bounds.size.width - padding));
y = CLAMP(y, (CGFloat)padding, (CGFloat)(self.view.bounds.size.height - padding));
希望有帮助!