1

我在这里使用从另一个答案中获取的代码,但基本上下面是我正在使用的代码。这样做的主要问题是,当我调用它时,它需要 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];
}
4

1 回答 1

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

希望有帮助!

于 2013-11-06T18:52:15.373 回答