2014-02-10 143 views
0

我试图通过点击一个按钮时单个UIImageView中的一些图像循环。按下按钮后,图像必须消失0.1秒。 下面的代码:延迟加载UIImageView中的图像

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 TAP)。 我猜想,我必须初始化UIImageView中的图像,因为它需要一定的时间才会出现在敲击和图像之间,并且因为它在0.1秒后消失......它根本不会显示。

我试图加载它们里面viewDidLoad这样的:

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

只是到最后的形象工程加载(在这种情况下,图像2)。

我是否应该在不同的UIImageView之间循环,而不是在单个UIImageView内循环使用不同的UIImage

任何其他提示?

+0

什么是图像,它们有多大?创建一个'UIImage'实际上并不会加载图像数据(您需要将其渲染到上下文中才能发生)。 – Wain

+0

图像为1MB到3MB之间的jpg。 1024x768,因为必须在iPad中全屏显示。 我怎样才能加载它们? – guardabrazo

+0

idk如果这是你如何拥有你的代码,但我不应该在它的前面;它应该是[imagesArray objectAtIndex:i]; – user2277872

回答

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

} 
+0

使用此动画,图像在0.1秒后不会消失。 我试过添加'完成:^(BOOL完成){self.myImageView。{0} {0} {0}image = nil; '但是这样,图像甚至不会出现。 – guardabrazo

+0

因此,用户点击后,你想图像出现0.1秒,然后消失? – Mika

+0

是的!这正是我想要的。 – guardabrazo

2

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

这样做有几个第三方代码位,如this或检查this discussion

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