2014-02-06 3 views
1

У меня есть изображение (файл .png), который я хочу разместить в ImageView в ViewController. Я использую следующий код, но симулятор дает мне пустой белый вид без изображения. Файл .png находится в том же каталоге, что и файлы ViewController. Вот код:Программно размещая изображение в UIImageView на UIViewController

@implementation ViewController 
{ 
    NSArray *_pArray; 
    UIImage *_image; 
    UIImageView *_imageView; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    _image = [[UIImage alloc] initWithContentsOfFile:@"TM-1P2.png"]; 
    _imageView = [[UIImageView alloc]initWithFrame:self.view.bounds]; 
    [_imageView setImage:_image]; 
    [_imageView setContentMode:UIViewContentModeScaleAspectFit]; 
    [self.view addSubview:_imageView];  
} 
+0

Является ли этот вид контроллер контроллер вид корневой для вашего приложение? Вы пытались изменить цвет фона контроллера представления, чтобы убедиться, что он появляется? – bneely

ответ

4

Если вы исследуете на _image (либо NSLog или в отладчике), это, вероятно, nil. С initWithContentsOfFile вы должны указать полный путь, например:

NSString *path = [[NSBundle mainBundle] pathForResource:@"TM-1P2" ofType:@"png"]; 
_image = [[UIImage alloc] initWithContentsOfFile:path]; 

В качестве альтернативы, вы можете использовать следующую команду, которая автоматически ищет изображения в комплекте:

_image = [UIImage imageNamed:@"TM-1P2.png"]; 

Этот последний синтаксис, imageNamed, кэширует изображение (т. е. будет хранить его в памяти, даже если вы отклоните контроллер вида). Это здорово, если вам придется использовать один и тот же образ снова и снова в приложении (потому что ему не придется перезагружать его каждый раз), но если вы используете его только один раз, вам может не понадобиться использовать imageNamed. Поскольку документация imageNamed говорит:

Если у вас есть файл изображения, который будет отображаться только один раз, и хотите, чтобы убедиться, что он не добавляется в кэш системы, вы должны вместо этого создать изображение с помощью imageWithContentsOfFile:. Это позволит сохранить одноразовый образ из кеша системы, что потенциально улучшит характеристики использования вашего приложения.

Обратите внимание, что оба они предполагают, что вы успешно добавили это изображение в свой комплект.

Если, с другой стороны, изображение находится в папке Documents, вы можете загрузить его следующим образом:

NSString *documentsPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0]; 
NSString *path = [documentsPath stringByAppendingPathComponent:@"TM-1P2.png"]; 
_image = [[UIImage alloc] initWithContentsOfFile:path]; 

Наконец, следует отметить, что IOS устройства чувствительны к регистру (обычно тренажер не является) , поэтому убедитесь, что ваша капитализация правильная.


Unrelated на ваш вопрос, эти переменные в фигурных скобках, вероятно, не должны быть определены в @implementation, а скорее вы должны поместить их в @interface. Например, вы можете поместить их в файл .h, или лучше, вы можете поместить их в расширении частного класса в файле .m, прямо перед @implementation:

@interface ViewController() 
{ 
    NSArray *_pArray; 
    UIImage *_image; 
    UIImageView *_imageView; 
} 
@end 

@implementation ViewController 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    NSString *path = [[NSBundle mainBundle] pathForResource:@"TM-1P2" ofType:@"png"]; 
    _image = [[UIImage alloc] initWithContentsOfFile:path]; 
    _imageView = [[UIImageView alloc]initWithFrame:self.view.bounds]; 
    [_imageView setImage:_image]; 
    [_imageView setContentMode:UIViewContentModeScaleAspectFit]; 
    [self.view addSubview:_imageView];  
} 

// ... 

@end 
+0

Спасибо за всю информацию! ImageName: работал. –

0

Вы шагнули в отладчике ?

Мне было бы интересно узнать, является ли _image не-ноль - и, по всей вероятности, причиной этого является то, что вы не добавили его в свой проект.

0

Если ваш образ назван как «ТМ-1P2.png» в вашем пачке, вы можете просто сделать следующее:

_image = [UIImage imageNamed:@"TM-1P2.png"];

+0

В качестве щедрости вы можете проголосовать за все правильные ответы, помимо принятия наиболее подходящего и/или быстрого ответа. – Rajiv

0
- (void)viewDidLoad { 

[super viewDidLoad]; 

UIImageView *imgView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, self.view.layer.frame.size.width, self.view.layer.frame.size.height)]; 

imgView.image = [UIImage imageNamed:@"emptyCart.jpeg"]; 

imgView.backgroundColor = [UIColor whiteColor]; 

imgView.contentMode = UIViewContentModeCenter; 

[self.view addSubview: imgView]; 

} 
+0

Можете ли вы объяснить, почему это решает вопрос OP? – mjuarez

+0

, потому что вам необходимо заменить это: _image = [[UIImage alloc] initWithContentsOfFile: @ "TM-1P2.png"]; : _image = [UIImage imageNamed: @ "TM-1P2.png"]; –

+0

, поэтому вы должны заменить эту строку: _image = [[UIImage alloc] initWithContentsOfFile: @ "TM-1P2.png"]; этой строкой: _image = [UIImage imageNamed: @ "TM-1P2.png"]; –

Смежные вопросы