我该如何在编程中动态更改UIImageView中显示的图片?

137

我有一个指向UIImageViewIBOutlet,但是当我查看UIImageView文档时,我找不到任何有关以编程方式更改该图像的提示。我是否必须从该UIImageView获取一个UIImage对象?

15个回答

185

如果你已经有一个指向UIImageView的IBOutlet,那么你只需要获取一张图片并在接收器(UIImageView)上调用setImage即可。下面是两个获取图片的例子。一个是从Web上获取,另一个是将其添加到Xcode的资源文件夹中。

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中并添加过渡效果。

附言:内存管理不包括在内。


1
谢谢,但是还是不行 :( 我在界面构建器中删除了图像,所以UIImageView是空的。然后我将它实现到了viewDidLoad方法中。但是什么都没有发生。图片名称100%正确指定了。我还使用setImage给outlet赋值了。还有其他什么方法可以尝试吗? - Thanks
3
你可能还没有在 Interface Builder(IB) 中将 IBOutlet 连接到 ViewController 的引用。请检查图片是否在资源文件夹中。 - Jordan
我不确定 SO 上的 necro 规则/影响,但我知道这帮助我解决了我的问题。我正在使用 iOS v5.1,xcode 4.3.2。 - Jake
1
在更改图像之前检查[UIViewController viewDidLoad]是否被调用。我因此陷入困境。8) - poGUIst
1
在这个解决方案的基础上,如果您正在使用图像资产目录,请只指定您的图像集的名称,例如: UIImage *image = [UIImage imageNamed: @"My Icon"]; 而不是 UIImage *image = [UIImage imageNamed: @"myicon.png"]; - Keith OYS

37
请注意,直到视图被添加到场景中,NIB文件才会连接所有的IBOutlets。如果您正在手动连接这些对象(如果它们在不同的NIB中),则需要牢记这一点。
因此,如果我的测试视图控制器有一个由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"];

30

这对我有用

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

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


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

17

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")!)!)
    }

}

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

10

在更改 UIImageView 的图片后,如果您使用 UIImageView 的尺寸来设置 UIScrollView 的 contentSize 和/或计算缩放比例,请不要忘记调用 sizeToFit()

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

9

按照Jordan的建议(实际上应该有效),尝试将UIImageView设置为可见:

 [imageView setHidden: NO];

同时,不要忘记将其附加到主UIView上:
[mainView addSubview: imageView];

并将其置于前台:

[mainView bringSubviewToFront: imageView];

希望将所有步骤结合起来,可以帮助您解决这个谜团。

8

我的问题在于我试图在另一个线程中更改图片。我尝试了以下步骤:

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

Call with:

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

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

7
如果你想在代码中设置UIImageView的图像,那么不要忘记将UIImageView作为父视图的子视图添加进去。
同时也不要忘记设置UIImageView的框架(frame)。
以下是代码示例。
UIImageView *myImage = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 460)];

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

[self.view addSubview:myImage];

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