2014-09-08 1 views

ответ

7

Обычно вам не придется. Вместо этого вы будете использовать каталог активов. 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, с которой они зарегистрированы.

+1

Отличное разложение! – seeker12

Смежные вопросы