Jak mogę programowo zmienić obraz wyświetlany w UIImageView?

134

Mam IBOutletdo UIImageView, ale kiedy patrzę na UIImageViewdokument, nie widzę żadnych wskazówek dotyczących programowej zmiany go. Czy muszę pobrać UIImagez tego obiekt UIImageView?

Dzięki
źródło

Odpowiedzi:

185

Jeśli masz już IBOutlet do UIImageView, wszystko, co musisz zrobić, to pobrać obraz i wywołać setImage na odbiorniku (UIImageView). Poniżej znajdują się dwa przykłady chwytania obrazu. Jeden z sieci Web i jeden, który dodajesz do folderu Zasoby w Xcode.

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

lub

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

Gdy masz już obraz, możesz ustawić UIImageView:

[imageView setImage:image];

Powyższa linia zakłada, że ​​imageView jest Twoim IBOutlet.

Otóż ​​to! Jeśli chcesz mieć ochotę, możesz dodać obraz do UIView, a następnie dodać przejścia.

Brak zarządzania pamięcią PS.

Jordania
źródło
1
dzięki, ale to nie działa :( Usunąłem obraz w konstruktorze interfejsu, więc UIImageView jest pusty. Następnie zaimplementowałem to w metodzie viewDidLoad. Ale nic się nie dzieje. Nazwa obrazu jest w 100% poprawna. Przypisałem go również za pomocą setImage do gniazdka. Coś jeszcze mogę spróbować?
Dzięki
3
Prawdopodobnie nie podłączyłeś IBOutlet do referencji ViewController w IB. Sprawdź, czy obraz znajduje się w folderze Zasoby.
Jordan
Nie jestem pewien, czy zasady nekro / wpływ na SO, ale wiem, że pomogło mi to rozwiązać mój problem. Używam systemu iOS v5.1, xcode 4.3.2
Jake
1
Sprawdź, czy [UIViewController viewDidLoad] jest wywoływana przed zmianą obrazu. Zostałem przez to uwięziony. 8)
poGUIst
1
Dodając do tego rozwiązania, jeśli korzystasz z Katalogu zasobów obrazu, po prostu podaj nazwę swojego zestawu obrazów, np. UIImage * image = [UIImage imageNamed: @ "My Icon"]; zamiast UIImage * image = [UIImage imageNamed: @ "myicon.png"];
Keith OYS,
37

Zwróć uwagę, że plik NIB nie łączy wszystkich IBOutletów, dopóki widok nie zostanie dodany do sceny. Jeśli podłączasz rzeczy ręcznie (co możesz zrobić, jeśli rzeczy są w oddzielnych NIB), należy o tym pamiętać.

Więc jeśli mój kontroler widoku testowego ma „imageView” połączony ze stalówką, to prawdopodobnie nie zadziała:

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

Ale to będzie:

  [self.view addSubview:testCardViewController.view];
  testCardViewController.imageView.image = [UIImage imageNamed:@"EmptyCard.png"];
samkass
źródło
29

To zadziałało dla mnie

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

Upewnij się, że ImageView jest poprawnie zadeklarowany w pliku .h i jest połączony z elementem IB.

Gilall
źródło
23
imageView.image = [UIImage imageNamed:@"myImage.png"];
Lukas Wiklund
źródło
16

Z myślą o osobach, które szukają w Google, aby spróbować rozwiązać swój problem, pamiętaj, aby poprawnie zadeklarować właściwość w pliku nagłówkowym i zsyntetyzować UIImageView w pliku implementacji ... Trudno będzie ustawić obraz programowo bez metody pobierające i ustawiające.

#import <UIKit/UIKit.h>

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

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

@end

a następnie w swoim .m:

@implementation YOURCONTROLLERNAME

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

Stamtąd powinno być dobrze, używając czegoś podobnego do następującego, aby ustawić swój obraz.

[YOURCONTROLLER.imageToDisplay setImage:[UIImage imageNamed:value]];
swiecki
źródło
Dzięki! Będąc nowym w xcode i iPhone'ach w ogóle, brakowało mi TWOJEGO KONTROLERA przed wyświetleniem imageToDisplay.
Opy
15

Przykład w 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")!)!)
    }

}
King-Wizard
źródło
9

Postępując zgodnie z radą Jordana (która w rzeczywistości powinna działać), spróbuj ustawić UIImageView tak, aby był widoczny:

 [imageView setHidden: NO];

a także - nie zapomnij dołączyć go do głównego UIView:

[mainView addSubview: imageView];

i przynieść na przód:

[mainView bringSubviewToFront: imageView];

Mam nadzieję, że połączenie wszystkich tych kroków pomoże ci rozwiązać zagadkę.

Adi
źródło
8

Mój problem polegał na tym, że próbowałem zmienić obrazek w innym wątku. Podobało mi się to:

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

Zadzwoń z:

[self performSelectorOnMainThread : @selector(changeImage) withObject:nil waitUntilDone:NO];
Okku
źródło
2
Tak, to mnie ugryzło ... znowu ... Można też użyćdispatch_async(dispatch_get_main_queue(), ^{backgroundImage.image = [UIImage imageNamed:@"img.png"];})
Dex
7

Jeśli chcesz ustawić obraz na UIImageViewprogramowo, nie zapomnij dodać UIImageView jako widoku podrzędnego do widoku głównego.

I nie zapomniałem ustawić ramki ImageView .

tutaj jest kod

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

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

[self.view addSubview:myImage];
Rajneesh071
źródło
7

Nie zapomnij wywołać sizeToFit()po zmianie obrazu, jeśli następnie użyjesz rozmiaru UIImageView, aby ustawić zawartość UIScrollView, rozmiar i / lub oblicz skalę powiększenia

let image = UIImage(named: "testImage")
imageView.image = image
imageView.sizeToFit()
scrollView.contentSize = imageView.bounds.size
Miroslav Hrivik
źródło
5
myUIImageview.image = UIImage (named:"myImage.png")
Helton Wernik
źródło
1
Oznaczone jako bardzo niska jakość. Proszę, popraw to.
Drew
Możesz to zrobić, rozwijając go.
Rohit Gupta
2
UIColor * background = [[UIColor alloc] initWithPatternImage:
    [UIImage imageNamed:@"anImage.png"]];

self.view.backgroundColor = background;
[background release];
Postrzeganie
źródło
Czy to jest to samo, aby przedstawić obraz przez tło UIView lub przez właściwość image UIImageView?
voromax
2

To pytanie miało już wiele odpowiedzi. Niestety żaden nie działał dla mnie. Więc ze względu na kompletność dodam, co mi pomogło:

Miałem wiele obrazów o tej samej nazwie - więc zamówiłem je w podfolderach. I miałem pełną ścieżkę do pliku obrazu, który chciałem pokazać. Z pełną ścieżką imageNamed:(jak we wszystkich rozwiązaniach powyżej) nie działała i była złą metodą.

Zamiast tego używam teraz imageWithContentsOfFile:tak:

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

Nie wiem, czy ktoś tak daleko czyta?

Jeśli tak, a ten ci pomógł: zagłosuj. ;-)

DerWOK
źródło
1

Praca ze Swift 5 (XCode 10.3) to po prostu

yourImageView.image = UIImage(named: "nameOfTheImage")
bytepunch
źródło
0

Aby ustawić obraz na swoim imageView użyj poniższej linii kodu,

self.imgObj.image=[UIImage imageNamed:@"yourImage.png"];                         
Vaibhav Shiledar
źródło
skopiuj obraz do swojego projektu, a następnie użyj powyższego kodu
Vaibhav Shiledar