动态更改UIImageView

时间:2015-05-08 15:37:06

标签: objective-c uiimageview uiimage

-(void)viewDidLoad {
    NSMutableArray *coolImagesArray = [[NSMutableArray alloc] initWithObjects:@"active-1.jpg", @"active-2.jpg", @"active-3.jpg", @"active-4.jpg", @"active-5.jpg", nil];
}

-(void)someMethodWithData {


        dispatch_async(dispatch_get_main_queue(), ^{
            NSMutableArray *imagesArray = [[NSMutableArray alloc] init];
            NSMutableString *inactiveString = [[NSMutableString alloc] init];

            for (int i = 0; i < progress; i++) {
                imageView.image = [UIImage imageNamed:[coolImagesArray objectAtIndex:i]];

                inactiveString = [NSMutableString stringWithFormat:@"inactive-%d.png",i];

                [imagesArray addObject:imageView];
            }

            UIImage *setImage = [UIImage imageNamed:@"inactive-1.png"];
            for (int i = 0; i < [imagesArray count]; i++) {
                [(UIImageView*)[imagesArray objectAtIndex:i] setImage:setImage];
            }

        });

}

这将始终正确设置最后一张或第i张图像。它不会循环和更改我需要的所有图像。还有另一种方法可以解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

imageView指向一个UIImageView对象,在循环中,您正在更改imageView的图像,而不是向您的数组添加新的UIImageView对象。数组中的所有对象都指向1个UIImageView对象。因此,只能更改最后一个对象的图像是很正常的,因为阵列中没有其他对象。 你应该这样做:

dispatch_async(dispatch_get_main_queue(), ^{
            NSMutableArray *imagesArray = [[NSMutableArray alloc] init];
            NSMutableString *inactiveString = [[NSMutableString alloc] init];

            for (int i = 0; i < progress; i++) {
                UIImageView *temp = [[UIImageView alloc] initWithFrame:imageView.frame];
                temp.image = [UIImage imageNamed:[coolImagesArray objectAtIndex:i]];

                inactiveString = [NSMutableString stringWithFormat:@"inactive-%d.png",i];

                [imagesArray addObject:temp];
            }

            UIImage *setImage = [UIImage imageNamed:@"inactive-1.png"];
            for (int i = 0; i < [imagesArray count]; i++) {
                [(UIImageView*)[imagesArray objectAtIndex:i] setImage:setImage];
            }

        });

答案 1 :(得分:0)

对于初学者,我会创建一次图像以节省内存。

我还会将对象转换为UIImageView(不确定它是如何在xcode中标记的)。

最后我将它包装在dispatch_async()中,以确保它在主UI线程上发生,因为它可能在后台线程上被调用,并且不知何故最后一个图像使它进入主运行循环,无论是这种方式是它的样子:

dispatch_async(dispatch_get_main_queue(), ^{
UIImage *setimage = [UIImage imageNamed:@"set-image.png"];    
for (int i = 0; i < [imagesArray count]; i++) {                
        [(UIImageView *)[imagesArray objectAtIndex:i] setImage:setimage]];
    }
});