2015-01-04 1 views
0

У меня есть массив UILabels, который я хочу оживить по экрану. Я итерация, хотя массив с использованием для петли, как показано ниже:Как я могу анимировать UILabels из массива, чтобы перемещаться по экрану с одинаковой задержкой между ними?

for(int i=0; i<[self.onScreenLabels count]; i++) 
{ 
    UILabel *label = self.onScreenLabels[i]; 

    int x = label.frame.origin.x; 
    int y = label.frame.origin.y; 

    label.center=CGPointMake(320, 0); 
    [self.view addSubview:label]; 

    [UIView animateWithDuration:0.3 delay:1.0 options:0 animations:^{ 

    label.center=CGPointMake(x, y); 

} completion:^(BOOL finished){ 

}]; 

} 

Хочу каждый UILabel задержать 1.0 секунды после того, как последний перед анимации, например, подождать 1 секунду, пожарить первым, подождать 1 секунду стрелять вторым, подождать 1 секунду огонь третий .... и т. д. до конца массива. Однако, используя этот код, существует 1 секунда задержки, но ВСЕ метки затем ожидают в одно и то же время. Почему это? Есть ли способ обойти это?

благодаря

ответ

1

Задержка по отношению к времени, в котором вы создаете анимацию, так, потому что все анимации созданы в то же время в цикле все они имеют одинаковую задержку.

Вместо этого установить задержку на индекс итерации (i):

[UIView animateWithDuration:0.3 delay:i options:0 animations:^{ ... 

так что первый будет начинаться с 0, второй в 1, третий на 2, и т.д.

(или (i + 1) если вы предпочитаете)

+0

Я действительно пробовал что-то вроде этого раньше, но это не сработало, и задержка между ними просто стала больше и больше. Я попробовал это снова, хотя и поставил i ++ INSIDE в блок (я должен быть слабым блоком var __block int i), и это устранило проблему! Теперь имеет смысл. Спасибо!!!!!! – Kex

+0

Почему, хотя все анимации создаются одновременно в цикле? – Kex

+0

Вам не нужно «i ++» внутри блока. 'animateWithDuration:' немедленно возвращается, он не блокирует вызывающего абонента до тех пор, пока анимация не завершится, поэтому все итерации цикла будут выполняться одновременно. – Wain

0

Использование задержки, как это:

[UIView animateWithDuration:0.3 delay:i + 1.0 options:0 animations:^{ 

Это задержит первую метку в течение 1 секунды, и каждый позже будет задержан на +1 секунду.