Как использовать создать и использовать 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, с которым они зарегистрированы.