Как использовать создать и использовать UIImageAsset в iOS 8

iOS 8 представляет класс UIImageAsset с методом registerImage:withTraitCollection:, Как я могу использовать этот класс?

1 ответ

Решение

Обычно вам не придется. Вместо этого вы будете использовать каталог активов. UIImageAsset в iOS 8 - это просто механизм, лежащий в основе наборов изображений в каталогах ресурсов.

Например, в iOS 8 каталог ресурсов может различать версии изображения, предназначенные для ситуаций с разными классами размеров, используя всплывающие меню "Ширина" и "Высота", чтобы указать возможности классов с разными размерами. Затем, когда вы используете изображение из каталога активов в своем интерфейсе, правильная вещь происходит автоматически. Если мы на iPhone с приложением, повернутым в горизонтальную ориентацию, и если в наборе изображений есть альтернатива Любая высота и Компактная высота, используется версия Компактная высота. И эти функции живы; если приложение поворачивается из альбомной в портретную, и в наборе изображений есть альтернатива любой высоты и компактной высоты, версия компактной высоты автоматически заменяется версией любой высоты в вашем интерфейсе.

Вы заметите, что я не упомянул UIImageAsset. Тем не менее, UIImageAsset является основным механизмом. Когда изображение извлекается из каталога активов через init(named:) и имя его набора изображений, его imageAsset свойство является UIImageAsset. Все изображения в этом наборе изображений доступны через UIImageAsset; каждое изображение имеет коллекцию признаков, связанную с ним (его traitCollection), и вы можете запросить UIImageAsset для изображения, соответствующего определенной коллекции признаков, вызвав imageWithTraitCollection:, На самом деле это именно то, что интерфейс делает для вас. Интерфейсный объект, который может отображать изображение, автоматически распознает коллекцию признаков в iOS 8; он получает traitCollectionDidChange: сообщение и отвечает соответственно.

Тем не менее, также возможно объединить изображения в свой собственный UIImageAsset. В некотором смысле это похоже на создание каталога ресурсов (или, по крайней мере, набора изображений) в коде! В этом примере я извлеку два изображения из комплекта приложения и настрою их так, чтобы одно использовалось, когда приложение находится в книжной ориентации, а другое - когда приложение находится в горизонтальной ориентации, автоматически:

let tcdisp = UITraitCollection(displayScale: UIScreen.mainScreen().scale)
let tcphone = UITraitCollection(userInterfaceIdiom: .Phone)
let tcreg = UITraitCollection(verticalSizeClass: .Regular)
let tc1 = UITraitCollection(traitsFromCollections: [tcdisp, tcphone, tcreg])
let tccom = UITraitCollection(verticalSizeClass: .Compact)
let tc2 = UITraitCollection(traitsFromCollections: [tcdisp, tcphone, tccom])
let moods = UIImageAsset()
let frowney = UIImage(named:"frowney")
let smiley = UIImage(named:"smiley")
moods.registerImage(frowney, withTraitCollection: tc1)
moods.registerImage(smiley, withTraitCollection: tc2)

После этого, если frowney помещается в интерфейс - например, путем передачи его в UIImageView в качестве своего изображения или путем назначения его в качестве изображения UIButton - он автоматически чередуется с smiley когда приложение меняет ориентацию.

Примечательно, что эта магия работает, хотя нет постоянных ссылок на frowney , smiley или UIImageAsset ( moods ) Причина в том, что frowney а также smiley кэшируются системой (из-за вызова init(named:)), и каждый из них поддерживает строгую ссылку на UIImageAsset, с которым они зарегистрированы.

Другие вопросы по тегам