我想循环遍历一个图像数组,然后将它们设置为uiimageview的新图像,但因为它是一个for循环,它显然会如此之快,你看不出差异。
我想在循环进行下一次迭代之前向循环添加约0.2秒的暂停。
有办法做到这一点吗?
更重要的是,有一种更简单的方法来完成我想用某种内置框架做的事情吗?谢谢!
答案 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];
});