ฉันจะเปลี่ยนรูปภาพที่แสดงใน UIImageView โดยทางโปรแกรมได้อย่างไร?


134

ฉันมีIBOutletถึง a 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 ตรวจสอบว่ารูปภาพอยู่ในโฟลเดอร์ทรัพยากร
จอร์แดน

ฉันไม่แน่ใจว่ากฎของ necro / ผลกระทบต่อ SO แต่ฉันรู้ว่าสิ่งนี้ช่วยฉันแก้ปัญหาได้ ฉันใช้ iOS v5.1, xcode 4.3.2
Jake

1
ตรวจหา [UIViewController viewDidLoad] ถูกเรียกก่อนที่จะเปลี่ยนภาพ ฉันติดอยู่กับมัน 8)
poGUIst

1
การเพิ่มโซลูชันนี้หากคุณใช้ Image Asset Catalog เพียงระบุชื่อชุดรูปภาพของคุณเช่น UIImage * image = [UIImage imageNamed: @ "My Icon"]; แทน UIImage * image = [UIImage imageNamed: @ "myicon.png"];
Keith OYS

37

โปรดทราบว่าไฟล์ NIB จะไม่เชื่อมต่อ IBOutlets ทั้งหมดจนกว่าจะมีการเพิ่มมุมมองลงในฉาก หากคุณเดินสายสิ่งต่างๆด้วยตนเอง (ซึ่งคุณอาจทำหากสิ่งต่างๆอยู่ใน 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"]];

ตรวจสอบให้แน่ใจว่า ImageView ได้รับการประกาศอย่างถูกต้องในไฟล์. h และเชื่อมโยงกับองค์ประกอบ IB



16

สำหรับจุดประสงค์ของผู้ที่อาจจะ googling สิ่งนี้เพื่อพยายามแก้ไขปัญหาของพวกเขาอย่าลืมประกาศคุณสมบัติในไฟล์ส่วนหัวของคุณอย่างถูกต้องและสังเคราะห์ 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 และ iphones โดยทั่วไปฉันพลาด YOURCONTROLLER ก่อน imageToDisplay
Opy

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

ตามคำแนะนำของ Jordan (ซึ่งควรใช้งานได้จริง) ลองตั้งค่า 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

นี่คือรหัส

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

คำถามนี้มีคำตอบมากมายอยู่แล้ว น่าเสียดายที่ไม่มีใครทำงานให้ฉัน ดังนั้นเพื่อความสมบูรณ์ฉันเพิ่มสิ่งที่ช่วยฉัน:

ฉันมีหลายภาพที่มีชื่อเดียวกัน - ดังนั้นฉันจึงสั่งซื้อในโฟลเดอร์ย่อย และฉันมีเส้นทางแบบเต็มไปยังไฟล์รูปภาพที่ฉันต้องการแสดง ด้วยเส้นทางแบบเต็มimageNamed:(ตามที่ใช้ในโซลูชันทั้งหมดข้างต้น) ไม่ได้ผลและเป็นวิธีการที่ไม่ถูกต้อง

ตอนนี้ฉันใช้แบบนี้แทนimageWithContentsOfFile::

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

ไม่รู้จะมีใครอ่านไปไกลไหม

ถ้าเป็นเช่นนั้นและสิ่งนี้ช่วยคุณได้: โปรดโหวต ;-)



0

ในการตั้งค่าภาพบน imageView ของคุณให้ใช้บรรทัดด้านล่างของรหัส

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

คัดลอกรูปภาพในโครงการของคุณแล้วใช้โค้ดด้านบน
Vaibhav Shiledar
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.