延迟在UIImageView中加载图像

时间:2014-02-10 16:01:57

标签: ios objective-c uiimageview uiimage

当我点按一个按钮时,我正试图在一个UIImageView中循环浏览一些图像。按下按钮后图像必须消失0.1秒。 这是代码:

int tapCount = 0;

UIImage *image0 = [UIImage imageNamed:@"0.jpg"];
UIImage *image1 = [UIImage imageNamed:@"1.jpg"];
UIImage *image2 = [UIImage imageNamed:@"2.jpg"];
imagesArray = [[NSArray alloc] initWithObjects:image0, image1, image2, nil];


-(IBAction)backgroundButton:(id)sender{

  self.myImageView.image = [imagesArray objectAtIndex:tapCount%3];
  tapCount++;
  [self performSelector:@selector(eraseImage) withObject:self afterDelay:0.1];   
}

-(void)eraseImage{

  self.myImageView.image = nil;
}

问题是图像在我完成整个循环(第4次点击)之后才会出现。 我猜不到我必须在UIImageView中初始化图像,因为在点击和图像出现之间需要一些时间,并且因为它在0.1秒后消失......它根本不显示。 / p>

我已经尝试在viewDidLoad内加载它们:

for(int i = 0; i<[imagesArray count]; i++){
  self.myImageView.image = [imagesArray objectAtIndex : i];
}

但它只适用于加载的最后一个图像(在这种情况下为image2)。

我应该在不同的UIImageView之间循环,而不是在单个UIImage内循环浏览不同的UIImageView吗?

还有其他提示吗?

4 个答案:

答案 0 :(得分:2)

创建UIImage实际上并不加载图像数据(您需要将其渲染到上下文中才能实现)。因此,如果您的图像很大,那么您可以在它们实际渲染到屏幕之前隐藏它们。您将无法同时在内存中保存许多图像,但您可以通过创建上下文并将图像绘制到其中来强制加载图像数据(可以在后台使用{{1 }})。

有一些第三方代码可以执行此操作,例如this或检查this discussion

答案 1 :(得分:1)

答案 2 :(得分:0)

我认为有一种更简单的方法来实现你想要的动画。请尝试以下代码:

-(IBAction)backgroundButton:(id)sender{


  [UIView animateWithDuration:0.2
                        delay:nil 
                      options:UIViewAnimationCurveEaseIn 
                   animations:^{
                        self.myImageView.image = [imagesArray objectAtIndex:tapCount%3];
                        self.myImageView.image = nil;

                       } 
             completion:nil
   ];

  tapCount++;

  if (tapCount == 2) {
       tapCount = 0;
  }

 }

答案 3 :(得分:0)

我终于设法使用这个解决方案:

首先我预加载后台线程中的所有图像

-(void)preload:(UIImage *)image{

CGImageRef ref = image.CGImage;
size_t width = CGImageGetWidth(ref);
size_t height = CGImageGetHeight(ref);
CGColorSpaceRef space = CGColorSpaceCreateDeviceRGB();
CGContextRef context = CGBitmapContextCreate(NULL, width, height, 8, width * 4, space, kCGBitmapAlphaInfoMask & kCGImageAlphaPremultipliedFirst);
CGColorSpaceRelease(space);
CGContextDrawImage(context, CGRectMake(0, 0, width, height), ref);
CGContextRelease(context);
}

然后我执行与开头相同的操作:

-(IBAction)backgroundButton:(id)sender{

   self.myImageView.image = [imagesArray objectAtIndex:tapCount%3];
   tapCount++;
   [self performSelector:@selector(eraseImage) withObject:self afterDelay:0.1];   
}

-(void)eraseImage{

  self.myImageView.image = nil;
}