2010-09-03 2 views
0

Я добавляю UIViews к надтаблицам в следующем цикле:Как отправить сообщение с выдержкой времени на UIView на таймере

int xValue = 0 ; 
int yValue = 10; 
for (NSString *element in characters) { 
    UIView *newCharView = [[MyChar alloc] initWithFrame:CGRectMake(xValue,yValue,100,100)]; 
    [(MyChar *)newCharView initLayers:element]; 
    [[self view] addSubview:newCharView]; 
    [newCharView autorelease]; 

    if (xValue <= 240) { 
     xValue+=22; 
    } else { 
     xValue = 0; 
     yValue += 22; 
    } 

} 

MyChar содержит метод, который стреляет анимацию. Я хочу, чтобы метод вызывался последовательно в моем цикле с задержкой, скажем, 0,2 секунды. Как я могу это достичь? Я пробовал задерживать анимацию, но, очевидно, просто получаю такую ​​же задержку во всех UIView.

ответ

2

Вы можете попробовать использовать что-то вроде этого:

int xValue = 0 ; 
int yValue = 10; 
double delay = 0.2; 
for (NSString *element in characters) { 
    UIView *newCharView = [[MyChar alloc] initWithFrame:CGRectMake(xValue,yValue,100,100)]; 
    [self performSelector:@selector(delayedInitView:) withObject:element afterDelay:delay]; 

    if (xValue <= 240) { 
     xValue+=22; 
    } else { 
     xValue = 0; 
     yValue += 22; 
    } 
    delay += 0.2; 

} 

-(void) delayedInitView: (id) element { 
    [(MyChar *) newCharView initLayers: element]; 
    [[self view] addSubview: newCharView]; 
    [newCharView autorelease]; 
} 

Вы должны будете экспериментировать с этим, так как я не знаю, что именно вы пытаетесь достигать.

EDIT: Ой, это определенно не очень хороший способ пойти с таким большим количеством просмотров. Вы можете попытаться использовать один цикл фона, чтобы инициализировать все из них. Мне бы определенно пришлось подумать об этом больше, если бы я лично столкнулся с этой проблемой, но вот простое предложение, вам нужно будет настроить его на свои нужды и, возможно, позаботиться о своей безопасности управления потоком/памятью:

[self performSelectorInBackground:@(backgroundInitViews:) withObject:characters] 

-(void) backgroundInitViews: (NSArray*) elements { 
    NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; 
    int xValue = 0 ; 
    int yValue = 10; 
    for (NSString *element in elements) { 
     UIView *newCharView = [[MyChar alloc] initWithFrame:CGRectMake(xValue,yValue,100,100)]; 
     [(MyChar *) newCharView initLayers: element]; 
     [[self view] addSubview: newCharView]; 
     [newCharView autorelease]; 


     if (xValue <= 240) { 
      xValue+=22; 
     } else { 
      xValue = 0; 
      yValue += 22; 
     } 
     [NSThread sleepForTimeInterval:0.2]; 
    } 
    [pool drain]; 
} 
+0

Спасибо, что работает. Производительность отлично в симуляторе, но на устройстве (iPhone4) его ужасно. Я не говорю его код, который вы предложили, но если я добавлю 140 UIViews, каждый из которых содержит до 30 уровней, есть ли более эффективный способ сделать это? – codecowboy

+0

Я только что отредактировал свой ответ, это должно увеличить производительность. – Mayjak

0

Дайте это попробовать:

[self performSelector:@selector(postAnimationMethod) withObject:self afterDelay:0.2]; 
Смежные вопросы