如何通过代码更改UIImageView的图像内容?

4

我使用这个来分配图片:

UIImage *img = [UIImage imageWithContentsOfFile: [[NSBundle mainBundle] pathForResource:@"myImage" ofType:@"png"]];
CGRect cropRect = CGRectMake(175, 0, 175, 175);
CGImageRef imageRef = CGImageCreateWithImageInRect([img CGImage], cropRect);
imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 175, 175)];
imageView.image = [UIImage imageWithCGImage:imageRef];
[self addSubview:imageView];
CGImageRelease(imageRef);

现在,我想将图片从myImage更改为myImage2,所以我这样做:
    UIImage *img = [UIImage imageWithContentsOfFile: [[NSBundle mainBundle] pathForResource:@"myImage2" ofType:@"png"]];
CGRect cropRect = CGRectMake(175, 0, 175, 175);
CGImageRef imageRef = CGImageCreateWithImageInRect([img CGImage], cropRect);
imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 175, 175)];
imageView.image = [UIImage imageWithCGImage:imageRef];
[self addSubview:imageView];

它能正常工作,但不是我想要的方式,我想更改图像,而不是在之前的imageView上添加一个新的imageView。我该如何修改我的代码?谢谢。

4个回答

6

或者,这也可以通过标签来完成。

//Set up the imageView in viewDidLoad or similar
UIImageView * imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 175, 175)];
[imageView setTag:123];
[self.view addSubview:imageView];
[imageView release];

那么,每当您想更改图像时,您只需要使用:

[(UIImageView*)[self.view viewWithTag:123] setImage:[UIImage imageWithCGImage:imageRef]];

只是另一个选择,其他答案同样有效。


4

我是一个有用的助手,可以进行文本翻译。

我刚刚花了一天时间研究这个棘手的问题,所以我想分享一下如何更改UIImageView上的图像。关于这个问题的太多帖子都不能展示一个简单的方法来实现这一点,所以在这里我将介绍一下...

如果你想改变在imageView上显示的图像

在你的.h文件中

IBOutlet UIImageView *imageView;
@property (nonatomic, retain, readwrite) IBOutlet UIImageView *imgView;

在你的 .m 文件中

-(void)viewDidLoad
{
    [super viewDidLoad];
    self.imageView = [[UIImageView alloc] initWithFrame:CGRectMake(133, 230, 60, 60)];
    self.imageView.image = [UIImage imageNamed:@"firstPicure.png"];
    [self.view addSubview:self.imageView];
}

现在更改您在imageView中显示的图像。这种方法的一个好处是,imageNamed将返回一个自动释放的图像实例,因此您可以避免内存泄漏,并且为了简单起见,您可以使用performSelectorOnMainThread来处理更改。

-(void)changeImage
{
    [self.imageView performSelectorOnMainThread:@selector(setImage:) withObject: [UIImage imageNamed:@"secondPicture.png"] waitUntilDone:YES];
}

3

我不确定你为什么要裁剪图片;只需适当设置contentMode属性即可。另一种方法:

UIImage *image = [UIImage imageNamed:@"myImage.png"];
UIImage *image2 = [UIImage imageNamed:@"myImage2.png"];
UIImageView *imageView = [[UIImageView alloc] initWithFrame:...];
imageView.contentMode = UIViewContentModeTopLeft;
imageView.image = image;
[self.view addSubView:imageView];
...
imageView.image = image2;

我能从 [self.view] 中恢复 imageView 吗? - Tattat
你可以随时使用一个标签,并通过self.view的viewWithTag:方法来获取视图: - Paul Lynch

2

目前,您正在创建一个新的UIImageView并将其添加到子视图列表中。 正如您所看到的,然后您最终会得到两个图像视图。 您想要的是仅更改第一个视图显示的图像。 保留对您创建的UIImageView的句柄(可能作为成员字段),当您想要更改图像时,只需编写

UIImage *img = [UIImage imageWithContentsOfFile: [[NSBundle mainBundle] pathForResource:@"myImage2" ofType:@"png"]];
imageView.image = [UIImage imageWithCGImage:imageRef];

@Adam_Wright 什么是imageRef?你是不是漏掉了一行代码,还是我应该知道这是什么?谢谢。 - StoneBreaker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接