Як я можу змінити зображення, що відображається у програмі UIImageView, програмно?


134

У мене є IBOutletа UIImageView, але, дивлячись на UIImageViewдокумент, я не бачу жодних підказів щодо програмного його зміни. Чи повинен я отримати UIImageпредмет з цього UIImageView?

Відповіді:


185

Якщо у вас вже є IBOutlet для UIImageView, то все, що вам потрібно зробити, - це захопити зображення і викликати setImage на приймачі (UIImageView). Два приклади захоплення зображення наведені нижче. Один з Інтернету, і той, який ви додасте до папки Ресурси в 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, а потім додати переходи.

Управління пам'яттю PS не входить.


1
спасибі, але він не працює :( я видалив зображення в інтерфейсі конструктора, щоб UIImageView був порожнім. тоді я реалізував це в методі viewDidLoad. Але нічого не відбувається. Ім’я зображення вказано на 100% правильно. Я також призначив його за допомогою setImage до розетки. Що ще я можу спробувати?
Дякую

3
Напевно, ви не підключили IBOutlet до посилання ViewController в IB. Перевірте зображення в папці Ресурси.
Йорданія

Я не впевнений, що некрологічні правила / вплив на ТА, але я знаю, що це допомогло мені вирішити свою проблему. Я використовую iOS v5.1, xcode 4.3.2
Джейк

1
Перевірте, чи викликається [UIViewController viewDidLoad] перед зміною зображення. Я захоплений цим. 8)
poGUIst

1
Додавши до цього рішення, якщо ви використовуєте Каталог активів зображень, просто вкажіть назву набору зображень, наприклад, UIImage * image = [UIImage imageNamed: @ "My Icon"]; замість UIImage * image = [UIImage imageNamed: @ "myicon.png"];
Кіт OYS

37

Зауважте, що файл NIB не з'єднує всі IBOutlets до тих пір, поки вигляд не буде додано на сцену. Якщо ви під'єднуєте речі вручну (що ви можете зробити, якщо вони знаходяться в окремих НІБ), це важливо пам’ятати.

Тож якщо у мого контролера тестового перегляду є "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"]];

Переконайтесь, що ImageView оголошено належним чином у файлі .h та пов’язано з елементом IB.



16

Для того, щоб люди, які можуть це погуглити, намагалися вирішити свою проблему, пам’ятайте, що належним чином оголосити властивість у вашому файлі заголовка та синтезувати UIImageView у вашому файлі реалізації ... Буде важко встановити зображення програмно без геттерні та сетерні методи.

#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 взагалі я бракував YOURCONTROLLER перед imageToDisplay.
Опі

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

7

Якщо ви хочете встановити зображення UIImageViewпрограмно, то не забудьте додати UIImageView як основний вигляд SubView .

А також не забув встановити 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?
voromax

2

На це запитання вже було багато відповідей. На жаль, ніхто не працював на мене. Тож заради fullnes додаю те, що мені допомогло:

У мене було кілька зображень з однаковою назвою - тому я замовив їх у підпапках. У мене був повний шлях до файлу зображень, який я хотів показати. З повним шляхом imageNamed:(як це було використано у всіх рішеннях вище) не спрацював і був неправильним методом.

Натомість я зараз використовую imageWithContentsOfFile: так:

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

Не знаю, чи хтось читає так далеко?

Якщо так, і цей вам допомог: будь ласка, проголосуйте. ;-)


1

Робота зі Swift 5 (XCode 10.3) просто

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

0

Щоб встановити зображення на imageView, використовуйте рядок коду,

self.imgObj.image=[UIImage imageNamed:@"yourImage.png"];                         

скопіюйте Зображення у свій проект, а потім скористайтеся вищевказаним кодом
Vaibhav Shiledar
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.