Когда изображение UIImageView установлено в Интерфейсном Разработчике, как это изображение загружается?

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

РЕДАКТИРОВАТЬ: я пытаюсь изменить любой вызванный метод (если это возможно) для динамической замены активов позже.

2 ответа

Решение

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

РЕДАКТИРОВАТЬ:

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

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

Тем не менее, они все еще загружаются через какой-то внутренний механизм, а не через imageNamed:

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;
Другие вопросы по тегам