动画在开始前被延迟

时间:2013-11-06 18:22:37

标签: ios iphone objective-c uikit core-animation

我正在使用从另一个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];
}

1 个答案:

答案 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));

希望有帮助!