Xcode 6 загружает 3-кратное изображение неправильно, если для приложения Deployment Target установлено значение 6.0 или 6.1

Я получаю эту проблему при создании пользовательского интерфейса в раскадровке (или xib) в построителе интерфейса xcode. После того, как я присвою образ (с тем же именем в каталоге активов) для представления изображения в Interface Builder, xcode загружает файл с изображением 3x вместо 2x в любых устройствах без сетчатки, на которых работает ios8.

Обратите внимание, что эта ошибка возникает только в том случае, если для цели развертывания приложения установлено значение 6.0 или 6.1.

Я использую каталог ресурсов для управления ресурсами изображений.

Эта проблема протестирована и происходит как в Xcode 6.0.1, так и в 6.1 GM seed 2.

Я искал эту проблему и редко мог найти соответствующую тему. Поэтому я задаюсь вопросом, есть ли у кого-то одна проблема со мной и каков наилучший способ ее решения. Спасибо.

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

  • Установите Xcode 6

  • Создайте проект iOS и установите в качестве языка проекта objective-c.

  • Измените цель развертывания приложения на 6.0 или 6.1.

  • Добавьте 1x, 2x и 3x версию изображения в каталог активов.

  • В конструкторе интерфейса добавьте UIImageView к представлению диспетчера представлений по умолчанию для раскадровки по умолчанию.

  • В конструкторе интерфейса установите имя изображения как одно и то же имя изображения, добавленное в шаге 4 в каталоге активов.

  • Выберите симулятор как iPhone6 ​​(или любой симулятор работает на iOS 8.0, кроме iPhone6 ​​Plus).

  • Очистить проект (продукт/очистить).

  • Запустите проект.


ОБНОВЛЕНИЕ:

Как заметил в комментарии @Andrei Mankevich, этот баг, похоже, исправлен в iOS 8.1.

И я подтвердил это с помощью симулятора, работающего под iOS 8.1 в Xcode 6.1 GM seed 2 (извините, что в настоящее время у меня нет реального устройства с iOS 8.1).

Как заметил @Andrei Mankevich, эта ошибка может существовать только в iOS 8.0.x.

Ответ 1

После некоторого исследования похоже, что эта проблема действительно связана с iOS, и поэтому вряд ли она будет исправлена ​​в результате обновления Xcode. Что документация говорит о Каталог активов:

Для проектов с целью развертывания, по крайней мере, для iOS 7 или OS X 10.9, Xcode компилирует ваши каталоги активов в формат двоичного файла времени выполнения, что сокращает время загрузки вашего приложения.

Поэтому, когда мы используем целевые ресурсы развертывания, ресурсы 6.0 просто хранятся по-разному внутри файла IPA. В то время как iOS 8.0 загружается скомпилированным resouctions правильно, у него есть проблема с загрузкой некомпилированных ресурсов и всегда загружает изображения плотности 3x. И эта проблема уже была исправлена ​​в iOS 8.1.

Что касается возможного обходного пути в нашем приложении, мы исправили его, установив точный размер каждого элемента в xib и используя значение UIViewContentModeScaleAspectFit для флага contentMode. Мы используем одни и те же ресурсы изображения с разным разрешением, поэтому после масштабирования они также выглядят одинаково. Но, конечно, это должно отрицательно сказаться на производительности.