2013-11-06 4 views
1

Я использую код, взятый из другого 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]; 
} 

ответ

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

Надеюсь, что поможет!

+0

Привет, спасибо за ответ, я обычно использую блоки, но я скопировал код из другого места, так что, возможно, это его ... Вскоре я попробую. Я использую прописку, чтобы мои круги могли выйти за пределы видимой области (но достаточно, чтобы скрыть только половину из них). – Chris

+0

В другом примечании. Если я снова вызову ту же функцию в обработанном обработчике, это вызовет стоп-поток в некоторой точке во время выполнения или он «отправляется» обратно в очередь сообщений во время блока? – Chris

+0

Хорошо ... Так что «работает», но у меня все еще есть массивная начальная задержка! – Chris

Смежные вопросы