2011-12-20 39 views
0

我想循环访问一个图像数组,然后将它们设置为uiimageview的新图像,但是因为它是for循环,所以它显然速度太快,您不能看到有所不同。等待,然后迭代下一个循环在目标c(ios)

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

有没有办法做到这一点?

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

回答

1

更多的上下文会很有用,但听起来好像你应该看看NSTimer

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传递。

2

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

0

下面是一个逻辑是怎样的计时器将在延迟递归调用的函数,而一旦阵列的迭代完成,禁止定时器

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

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