如何在iOS 8中使用创建和使用UIImageAsset



iOS8引入了一个具有方法registerImage:withTraitCollection:的UIImageAsset类。我该如何使用这个类?

通常情况下,您不必这样做。相反,您将使用资产目录。在iOS8中,UIImageAsset只是资产目录中图像集的底层机制。

例如,在iOS 8中,资产目录可以使用"宽度"one_answers"高度"弹出菜单来指定不同大小类别的可能性,从而区分不同大小类别情况下的图像版本。然后,当您在界面中使用资产目录中的图像时,正确的事情会自动发生。如果我们在iPhone上,应用程序旋转到横向,并且图像集中同时有"任意高度"one_answers"紧凑高度"选项,则使用"紧凑高度版本"。这些特征是真实的;如果应用程序从横向旋转到纵向,并且图像集中同时有任意高度和紧凑高度选项,则紧凑高度版本将被界面中的任意高度版本替换将自动

你会注意到我没有提到UIImageAsset。然而,UIImageAsset是底层机制。当通过init(named:)及其图像集的名称从资源目录中提取图像时,其imageAsset属性为UIImageAsset。该图像集中的所有图像都可以通过UIImageAsset获得;每个图像都有一个与其关联的特征集合(其traitCollection),您可以通过调用imageWithTraitCollection:向UIImageAsset请求适合特定特征集合的图像。事实上,这正是接口为您所做的。一个可以显示图像的界面对象是iOS 8中自动识别的特征集合;它接收CCD_ 6消息并相应地进行响应。

但是,也可以将图像组合到您自己的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交替。

值得注意的是,即使没有对frowneysmiley或UIImageAsset(moods)的持久引用,这种魔力仍然有效。原因是frowneysmiley是由系统缓存的(因为对init(named:)的调用),并且它们都对注册的UIImageAsset保持强引用。

最新更新