我有一个在 iPhone 和 iPad 上运行的应用程序,该应用程序的大多数预期设备将是视网膜设备,iPad mini 除外。我有很多图片要包含在这个应用程序中。我的问题是,如果我决定只使用 @2x 图像,iOS 会将它们降级为非视网膜设备吗?所以我只运送视网膜图像?如果这是正确的,那么实施是不是一个坏主意?
3 回答
如果您的图像视图具有 contentMode = scale 您的图像将被缩放以在非视网膜上正确显示
但是有一些问题:
1) 如果您在非视网膜设备上显示缩放的视网膜图像,您的图像边缘会模糊。因此,如果您想将此图像用于 UI - 这将是一个坏主意。
2)如果您只有@2x 图像(例如在 uibuttons 中),有时 xCode 故事板无法正确缩放图像
iOS 不会降级这些图像。但是,如果您仔细设置图像视图的框架,则不会产生任何问题。
例如,如果您在 Interface Builder 中分配图像,并且将 a 上的图像属性设置UIImageView
为image@2x.png
,iOS 将不会知道它是高分辨率的“2x”图像。事实上,在视网膜显示器上,iOS 会查找名为image@2x@2x.png
. 由于它不会找到它,它会将图像的比例因子设置为 1.0。
该contentMode
属性(只是 XCode 中的“模式”)将决定是否发生任何图像缩放以适应 UIImageView 的约束。您可能希望将模式设置为“Aspect Fit”以使高分辨率图像根据视网膜和非视网膜显示器的需要进行缩放。通常,图像将显示为在 Interface Builder 中所见。
如果您使用 UIImageimageNamed
或类似的函数来加载图像,并且只指定image
(其中“image.png”不存在,但“image@2x.png”存在),那么 iOS 实际上会在非视网膜显示,尽管比例因子为 1.0。如前所述,您需要对其进行缩放以适合您的视图。该图像将在视网膜设备上正常工作,并且比例因子将设置为 2.0,因为 iOS 首先查找“2x”图像,而其他文件是否存在并不重要。
这是来自Apple的文档imageNamed
:
在运行 iOS 4 或更高版本的设备上,如果设备的屏幕比例为 1.0,则行为相同。如果屏幕的比例为 2.0,则此方法首先搜索具有相同文件名并附加 @2x 后缀的图像文件。例如,如果文件名是 button,它首先搜索 button@2x。如果找到 2x,则加载该图像并将返回的 UIImage 对象的 scale 属性设置为 2.0。否则,它将加载未修改的文件名并将比例属性设置为 1.0。有关支持具有不同比例因子的图像的更多信息,请参阅 iOS 应用程序编程指南。
如果可能的话,你真的应该包括视网膜和非视网膜图像。使用比必要分辨率更高的图像会对内存和性能产生负面影响。