我想循环访问一个图像数组,然后将它们设置为uiimageview的新图像,但是因为它是for循环,所以它显然速度太快,您不能看到有所不同。等待,然后迭代下一个循环在目标c(ios)
我想在循环进行下一次迭代之前给循环添加约0.2秒的暂停。
有没有办法做到这一点?
更重要的是,有更简单的方法来完成我想用某种内置框架做什么?谢谢!
我想循环访问一个图像数组,然后将它们设置为uiimageview的新图像,但是因为它是for循环,所以它显然速度太快,您不能看到有所不同。等待,然后迭代下一个循环在目标c(ios)
我想在循环进行下一次迭代之前给循环添加约0.2秒的暂停。
有没有办法做到这一点?
更重要的是,有更简单的方法来完成我想用某种内置框架做什么?谢谢!
更多的上下文会很有用,但听起来好像你应该看看NSTimer
。
替代你想要什么,但会更好地工作,使用的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传递。
向for循环添加延迟不会产生任何影响,因为只有在将控制权返回给主事件循环后,重绘才会发生。设置一个定时器,每隔一段时间向你发送一条消息,以便前进到你想要显示的下一张图像。
下面是一个逻辑是怎样的计时器将在延迟递归调用的函数,而一旦阵列的迭代完成,禁止定时器
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];
}
你最好使用财产的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];
});