2013-06-04 3 views
9

Когда источник изображения предварительно настроен из инспектора атрибутов, когда/как фактический путь к файлу разрешен? Кажется, нет никаких вызовов NSBundle, но я могу ошибаться.Когда изображение UIImageView настроено из Interface Builder, как загружается это изображение?

EDIT: Я пытаюсь использовать любой метод, который называется (если возможно) для динамической замены активов позже.

enter image description here

+1

Не было бы просто быть по отношению к пучку, что контроллер представления находится в? – borrrden

+1

Может быть, он называет [UIImage imageNamed:]? Я не сумасшедший ниндзя, поэтому я не знаю, как это можно отменить. – morningstar

+0

Хорошо, но, похоже, он не использует этот метод. – kasrak

ответ

9

Ни один из UIImage вызываются инициализаторы или фабрики.
Я провел некоторое исследование с отладчиком (на iOS Simulator 7.0.3) и нашел следующее:
1) UIImageView, который настроен в IB, инициализируется через -initWithCoder:.
2) В initWithCoder: метод decodeObjectForKey: называется. И (!) Ключ с именем UIImage содержит изображение из IB. Это изображение установлено на UIImageView через ivar, а не через setImage: setter.
Итак, похоже, что IB упаковывает необработанные данные изображения в XIB/Storyboard во время компиляции. Глупости, но это правда.
Вот почему мы не можем Swizzle +imageNamed: или какой-либо другой завод и использовать условный код для изображений установки для retina4 и iOS6

EDIT:

Комментарии показать, что hexdumping скомпилированного файла IB имеет детские название внутри.

В самом деле, глядя на выходе "HexDump -C BYZ-38-t0r-вид-8bC-Xf-vdC.nib" указывает на то, что имя файла PNG появляется в скомпилированный файл. Таким образом, он должен загружать данные файла через имя файла из того же пакета.

Однако они по-прежнему загружается через некоторый внутренний механизм, а не через imageNamed:

+0

Да ... так что нет способа подкачать какой-то метод, например imageNamed? – jerrygdm

+0

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

+1

Комментарий к «IB пакеты необработанных данных изображения в XIB» не имеет смысла. Я просто посмотрел на скомпилированную раскадровку и обнаружил, что данные изображения не встроены в выходной файл BYZ-38-t0r-view-8bC-Xf-vdC.nib. Фактически, просмотр вывода «hexdump -C BYZ-38-t0r-view-8bC-Xf-vdC.nib» указывает на то, что имя файла PNG появляется в скомпилированном файле. Таким образом, он должен загружать данные файла через имя файла из одного и того же пакета. – MoDJ

2

IOS будет автоматически искать файл overflow.png в той же связке, как файл XIb. Если ваш xib-файл находится только в целевом приложении вашего приложения, то по умолчанию он отображается внутри основного пакета.

Если вы хотите программно загрузить новое изображение в целях изображения и ваше изображение внутри основного пучка:

UIImage *image = [UIImage imageNamed:@"MyAwesomeImage"]; 
self.imageView.image = image; 

Если изображение находится внутри другого пучка:

NSBundle *imageBundle = ... // [NSBundle mainBundle] if your image is inside main bundle 
NSString *imagePath = [imageBundle pathForResource:@"MyAwesomeImage" ofType:@"png"]; 
UIImage *image = [UIImage imageWithContentsOfFile:imagePath]; 
self.imageView.image = image; 
+0

Да, но есть ли какой-либо метод, путь? (См. Редактирование для мотивации). – kasrak

+0

@kasrak, Вам нужен путь изображения overflow.png? Это в главном комплекте? –

+0

Не думаю, что я был очень ясен.Мне интересно, как среда выполнения инициализирует UIImageView, когда загружает ее из раскадровки/xib. Это позволит автоматически заменять изображения в приложении без каких-либо изменений кода. – kasrak