当我点按一个按钮时,我正试图在一个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
吗?
还有其他提示吗?
答案 0 :(得分:2)
创建UIImage实际上并不加载图像数据(您需要将其渲染到上下文中才能实现)。因此,如果您的图像很大,那么您可以在它们实际渲染到屏幕之前隐藏它们。您将无法同时在内存中保存许多图像,但您可以通过创建上下文并将图像绘制到其中来强制加载图像数据(可以在后台使用{{1 }})。
有一些第三方代码可以执行此操作,例如this或检查this discussion。
答案 1 :(得分:1)
使用UIImageView的animationImages
和animationDuration
属性
答案 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;
}