В iOS 8 представлен класс UIImageAsset с методом registerImage:withTraitCollection:
. Как использовать этот класс?Как использовать создание и использование UIImageAsset в iOS 8
ответ
Обычно вам не придется. Вместо этого вы будете использовать каталог активов. UIImageAsset, в iOS 8, является просто механизмом, лежащим в основе наборов изображений в каталогах активов.
Например, в каталоге iOS 8 каталог активов может различать версии изображения, предназначенные для ситуаций с разным размером, используя всплывающие меню «Ширина и высота», чтобы указать различные возможности класса размера. Затем, когда вы используете изображение из каталога активов в своем интерфейсе, правильная вещь происходит автоматически. Если мы находимся на iPhone с приложением, повернутым в альбомную ориентацию, и если в наборе изображений есть как высота, так и компактная высота, используется версия Compact height. И эти функции живут; если приложение поворачивается от пейзажа к портрету, и в изображении есть как высота, так и компактная высота, версия Compact height - заменена с любой версией высоты в вашем интерфейсе, автоматически.
Вы заметите, что я не упомянул 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, с которой они зарегистрированы.
Отличное разложение! – seeker12