等待,然后在目标c(ios)中迭代下一个循环

时间:2011-12-20 10:22:51

标签: objective-c wait loops

我想循环遍历一个图像数组,然后将它们设置为uiimageview的新图像,但因为它是一个for循环,它显然会如此之快,你看不出差异。

我想在循环进行下一次迭代之前向循环添加约0.2秒的暂停。

有办法做到这一点吗?

更重要的是,有一种更简单的方法来完成我想用某种内置框架做的事情吗?谢谢!

5 个答案:

答案 0 :(得分:3)

替代你想要的东西,但会更好地工作 - 使用这种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传递。

答案 1 :(得分:2)

为for循环添加延迟不会产生任何影响,因为在将控制权返回给主事件循环之前不会进行重绘。设置一个计时器,每隔一段时间向您发送一条消息,以前进到您想要显示的下一个图像。

答案 2 :(得分:1)

更多上下文会很有用,但听起来你应该调查NSTimer

答案 3 :(得分:0)

下面的逻辑是Timer如何在延迟中递归调用函数,并且一旦完成数组的迭代,就禁用定时器

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

}

答案 4 :(得分:0)

您最好使用 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];
});