Подождите, прежде чем выполнять следующий цикл в цели c (ios) - PullRequest
0 голосов
/ 20 декабря 2011

Я хочу пройтись по массиву изображений, впоследствии установив их в качестве нового изображения uiimageview, но поскольку это цикл for, он, очевидно, делает это так быстро, что вы не можете увидеть разницу.

Я быхотел бы добавить паузу около 0,2 с в цикл, прежде чем он перейдет к следующей итерации.

Есть ли способ сделать это?

И что еще важнее, есть ли более простой способвыполнить то, что я хочу сделать с какой-то встроенной структурой?спасибо!

Ответы [ 5 ]

3 голосов
/ 20 декабря 2011

Альтернатива тому, что вы хотите, но будет работать лучше - используйте этот метод NSTimer с повторениями, как YES

+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)seconds target:(id)target selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)repeats

используйте некоторый метод changeImage, например

-(void) changeImage:(NSTimer*)theTimer
{
    //code to get the image
    NSUInteger idx=[yourArrayOfImages indexOfObjectIdenticalTo:yourImageView.image];
    if(idx<[yourArrayOfImages count])
        yourImageView.image=[yourArrayOfImages objectAtIndex:++id];
    [yourImageView setNeedsDisplay];
}

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

2 голосов
/ 20 декабря 2011

Добавление задержки в цикл for не будет иметь значения, потому что перерисовка не произойдет, пока вы не вернете управление в основной цикл обработки событий. Настройте таймер, чтобы отправлять вам сообщения так часто, чтобы переходить к следующему изображению, которое вы хотите показать.

1 голос
/ 20 декабря 2011

Больше контекста было бы полезно, но звучит так, как будто вы должны посмотреть на NSTimer.

0 голосов
/ 20 мая 2015

Вам лучше использовать свойство UIImageView - animationImages.

@property(nonatomic,copy) NSArray *animationImages;

Например, у вас есть UIImageView* animationImageView:

// pass NSArray of UIImage's in the order of desired appearance
animationImageView.animationImages = [NSArray arrayWithObjects:
                                      [UIImage imageNamed:@"image1"],
                                      [UIImage imageNamed:@"image2"],
                                      [UIImage imageNamed:@"image3"],
                                      [UIImage imageNamed:@"image4"],
                                      [UIImage imageNamed:@"image5"], nil];

animationImageView.animationDuration = 1.5; // duration (seconds) of ONE animation cycle   
animationImageView.animationRepeatCount = 3; // number of repeats (cycles)
animationImageView startAnimating];

Если вы хотите запустить другое действие , когда анимация заканчивается , используйте dispatch_after:

dispatch_time_t animTime = dispatch_time(DISPATCH_TIME_NOW, animationImageView.animationDuration * NSEC_PER_SEC);
dispatch_after (popTime, dispatch_get_main_queue(), ^(void){
     // do your stuff
     [self animationDidFinish];
});
0 голосов
/ 20 декабря 2011

Ниже приведена логика того, как таймер будет вызывать функцию рекурсивно с задержкой, и после завершения итерации массива отключите таймер

NSArray *arrayOfImages;

timer = [NSTimer scheduledTimerWithTimeInterval:0.2 target:self selector:@selector(timerFired:) userInfo:nil repeats:NO];

int i = 0
int count = [arrayOfImages count];
- (UIIMage *)timerFired:(NSTimer *)aTimer{

if (i == count)
{
    timer == nil;
    return nil;
}
i++;
return [arrayOfImages objectAtIndex:i];

}
...