9

iOS 8 引入了一个带有方法的 UIImageAsset 类registerImage:withTraitCollection:。我如何使用这个类?

4

1 回答 1

11

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

例如,在 iOS 8 中,资产目录可以区分用于不同尺寸类别情况的图像版本,使用 Width 和 Height 弹出菜单指定不同尺寸类别的可能性。然后,当您在界面中使用资产目录中的图像时,正确的事情会自动发生。如果我们在 iPhone 上将应用旋转为横向,并且图像集中同时存在 Any height 和 Compact height 选项,则使用 Compact height 版本。这些功能是实时的;如果应用程序从横向旋转到纵向,并且图像集中同时存在“任意高度”和“紧凑高度”选项,则界面中的“紧凑高度”版本会自动替换为“任意高度”版本。

你会注意到我没有提到 UIImageAsset。但是,UIImageAsset 是底层机制。当从资产目录中提取图像时,通过init(named:)其图像集的名称,其imageAsset属性是 UIImageAsset。该图像集中的所有图像都可以通过 UIImageAsset 获得;每个图像都有一个与之关联的特征集合(它的traitCollection),您可以通过调用 UIImageAsset 来向 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)

之后,将 iffrowney放入界面中——例如,通过将其作为图像交给 UIImageView,或者将其分配为 UIButton 的图像——它会在应用程序改变方向时自动交替。smiley

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

于 2014-09-08T00:55:43.873 回答