如何以编程方式更改UIImageView中显示的图像?


134

我有一个IBOutletUIImageView,但是当我查看UIImageView文档时,看不到任何以编程方式更改它的提示。我是否必须从中获取UIImage对象UIImageView

Answers:


185

如果已经有一个UIImageView的IBOutlet,那么您要做的就是获取图像并在接收器(UIImageView)上调用setImage。下面是两个捕获图像的示例。一种来自Web,另一种则添加到Xcode的Resources文件夹中。

UIImage *image = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://farm4.static.flickr.com/3092/2915896504_a88b69c9de.jpg"]]];

要么

UIImage *image = [UIImage imageNamed: @"cell.png"];

获得图像后,您可以设置UIImageView:

[imageView setImage:image];

上面的行假定imageView是您的IBOutlet。

而已!如果想花哨的话,可以将图像添加到UIView,然后添加过渡。

PS内存管理不包括在内。


1
谢谢,但是它不起作用:(我在界面生成器中删除了图像,所以UIImageView为空。然后我将其实现到viewDidLoad方法中。但是什么也没发生。图像名称指定了100%正确。我还为它分配了setImage我可以尝试吗?
感谢

3
您可能尚未将IBOutlet连接到IB中的ViewController引用。检查图像在资源文件夹中。
约旦,

我不确定坏死规则/对SO的影响,但是我确实知道这可以帮助我解决问题。我正在使用iOS v5.1,xcode 4.3.2
Jake

1
更改图像之前,请检查[UIViewController viewDidLoad]是否已调用。我被它困住了。8)
poGUIst 2012年

1
另外,如果使用的是Image Asset Catalog,则只需指定图像集的名称即可,例如UIImage * image = [UIImage imageNamed:@“ My Icon”]; 而不是UIImage * image = [UIImage imageNamed:@“ myicon.png”];
基思OYS

37

请注意,在将视图添加到场景之前,NIB文件不会连接所有IBOutlet。如果您要手动进行布线(如果将它们放在单独的NIB中,则可能要这样做),记住这一点很重要。

因此,如果我的测试视图控制器具有通过笔尖连接的“ imageView”,则可能无法正常工作:

  testCardViewController.imageView.image = [UIImage imageNamed:@"EmptyCard.png"];
  [self.view addSubview:testCardViewController.view];

但这将:

  [self.view addSubview:testCardViewController.view];
  testCardViewController.imageView.image = [UIImage imageNamed:@"EmptyCard.png"];

29

这对我有用

[ImageViewName setImage:[UIImage imageNamed: @"ImageName.png"]];

确保在.h文件中正确声明了ImageView并将其与IB元素链接。



16

对于可能会使用谷歌搜索解决问题的人,请记住在头文件中正确声明属性,并在实现文件中合成UIImageView ...很难以编程方式设置图像,而无需getter和setter方法。

#import <UIKit/UIKit.h>

@interface YOURCONTROLLERNAME : UIViewController {
    IBOutlet UIImageView *imageToDisplay;
}

@property (nonatomic, retain) IBOutlet UIImageView *imageToDisplay;

@end

然后在您的.m中:

@implementation YOURCONTROLLERNAME

@synthesize imageToDisplay;
//etc, rest of code goes here

从那里,您可以使用类似以下的方法来设置图像。

[YOURCONTROLLER.imageToDisplay setImage:[UIImage imageNamed:value]];

谢谢!一般来说,对于xcode和iPhone来说,我是新手,所以在imageToDisplay之前我缺少YOURCONTROLLER。
Opy 2011年

15

Swift中的示例:

import UIKit

class ViewController: UIViewController {

    @IBOutlet var myUIImageView: UIImageView!

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @IBAction func myAction(sender: UIButton) {
        let newImg: UIImage? = UIImage(named: "profile-picture-name")
        self.myUIImageView.image = newImg
    }

    @IBAction func myAction2(sender: UIButton) {
        self.myUIImageView.image = nil
        self.myUIImageView.image = UIImage(data: NSData(contentsOfURL: NSURL(string: "http://url/image.png")!)!)
    }

}

9

按照约旦的建议(应该可以实际使用),尝试将UIImageView设置为可见:

 [imageView setHidden: NO];

并且-不要忘记将其附加到主UIView上:

[mainView addSubview: imageView];

并带到前面:

[mainView bringSubviewToFront: imageView];

希望结合所有这些步骤将帮助您解决这个难题。


8

我的问题是我试图在另一个线程中更改图像。我确实是这样的:

- (void)changeImage {
    backgroundImage.image = [UIImage imageNamed:@"img.png"];
}

致电:

[self performSelectorOnMainThread : @selector(changeImage) withObject:nil waitUntilDone:NO];

2
是的,这又咬了我...再次...也可以使用dispatch_async(dispatch_get_main_queue(), ^{backgroundImage.image = [UIImage imageNamed:@"img.png"];})
Dex 2012年

7

如果要以UIImageView编程方式设置图像,则不要忘记将其UIImageView 作为视图添加到主视图。

并且也不要忘记设置ImageView Frame

这是代码

UIImageView *myImage = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 460)];

myImage.image = [UIImage imageNamed:@"myImage.png"];

[self.view addSubview:myImage];

7

sizeToFit()如果您随后使用UIImageView的大小来设置UIScrollView contentSize和/或计算缩放比例,则在更改图像后不要忘记调用

let image = UIImage(named: "testImage")
imageView.image = image
imageView.sizeToFit()
scrollView.contentSize = imageView.bounds.size


2
UIColor * background = [[UIColor alloc] initWithPatternImage:
    [UIImage imageNamed:@"anImage.png"]];

self.view.backgroundColor = background;
[background release];

通过UIView的背景或UIImageView的image属性显示图像是否相同?
voromax 2012年

2

这个问题已经有了很多答案。不幸的是,没有人为我工作。因此,为了完整起见,我添加了对我有帮助的内容:

我有多个具有相同名称的图像-因此我在子文件夹中订购了它们。而且我有要显示的图像文件的完整路径。具有完整路径imageNamed:(如上述所有解决方案中所使用的)无效,并且是错误的方法。

相反,我现在这样使用imageWithContentsOfFile:

self.myUIImage.image = [UIImage imageWithContentsOfFile:_currentWord.imageFileName];

不知道,如果有人读那么远?

如果是这样,这对您有帮助:请投票。;-)


1

使用Swift 5(XCode 10.3)只是

yourImageView.image = UIImage(named: "nameOfTheImage")

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.