为不同的 iOS 设备使用不同的图像分辨率

Posted

技术标签:

【中文标题】为不同的 iOS 设备使用不同的图像分辨率【英文标题】:Use different image resolutions for different iOS devices 【发布时间】:2015-09-10 05:21:03 【问题描述】:

我想在我的 ios 应用中显示一张图片。为了节省内存,我想显示仍与设备上的物理像素数匹配的最低分辨率

例如,可以显示为设备高度 1/4 的正方形。所以尺寸如下

iPhone 4s        240x240 像素

iPhone 5/5s     284x284 像素

iPhone 6          334x334 像素

iPhone 6+        480x480 像素

我查看了资产目录,但没有发现任何方法可以为 iPhone 4s、iPhone 5/5s 和 iPhone 6(它们是 @2x)提供不同的图像。唯一的区别是 iPhone 6+ (@3x)。

我也尝试添加 Retina 4 2x 选项,但这只会为 iPhone 5/5s 提供不同的图标 - 仍然无法区分 4s 和 6。

我知道我可以根据设备以编程方式选择图像,但资产目录只会将必要的图像下载到用户设备(不确定这是否属实,不过我记得读过一些关于它的内容),使应用程序占用更少的存储空间。如果只使用一张图片,那么包含四张图片将是低效的。

有什么方法可以为每个具有不同物理像素数量的 iOS 设备使用不同的图像分辨率?

请注意,我不是询问是否缩放图像,而是询问使用正确的分辨率(每个设备使用不同的图像),因此会减少 RAM显示时拍摄。

【问题讨论】:

投反对票的人,你能解释一下为什么这个问题不好吗? 【参考方案1】:

我最终只是为每个设备创建了一个不同的文件,并将它们命名为imageName@size,因此对于128x128 的狗的图像,该文件将命名为dog@128

这是我用来执行此操作的代码

func getPNGImageForSize(size: Float, named: String) -> UIImage?
    //the image size will be measured in points, which is the unit that is used
    //when setting the frames of UIViews. To turn this into pixels, it must be
    //multiplied by the screen's render scale (on an iPhone 6+, 1 point is equal
    //to 3 pixels, or 9 pixels in 2 dimensions (3^2).
    let scaled: Int = Int(ceil(size * Float(UIScreen.mainScreen().scale))
    let imageName: String = "\(named)@\(scaled)"

    //ofType set to png, because this image is a PNG
    let path = NSBundle.mainBundle().pathForResource(imageName, ofType: "png")

    return UIImage(contentsOfFile: (path ?? ""))

要调用它,我只需使用

getPNGImageForSize(Float(self.view.frame.height / 4), named: "dog")

这将导致以下图像,具体取决于设备

iPhone 4s           dog@240.png

iPhone 5/5s        dog@284.png

iPhone 6             dog@334.png

iPhone 6+           dog@480.png

这也可以更改为使用非方形图像,命名为imageName@width-height

func getPNGImageForSize(width: Float, height: Float, named: String) -> UIImage?  
    let scaledWidth: Int = Int(ceil(width * Float(UIScreen.mainScreen().scale))
    let scaledHeight: Int = Int(ceil(height * Float(UIScreen.mainScreen().scale))
    let imageName: String = "\(named)@\(width)-\(height)"

    let path = NSBundle.mainBundle().pathForResource(imageName, ofType: "png")

    return UIImage(contentsOfFile: (path ?? ""))

【讨论】:

【参考方案2】:

您需要将图像设置为在 iPhone6+ 中的样子,这将消耗@3x 图像,然后缩小到其@2x 图像大小,iPhone4S 将消耗到 iPhone6 设备,然后进一步缩放您的图像@1x 早期版本的 iPad 设备使用。

@1x @2x@3x 3 个比例创建3 个不同的图像。

只有 3 个,旧 iPhone - 3S、4 个、非视网膜 iPad 都使用 @1x​​ 图像,而 iPad Air、iPadretina、iPhone 4S - iPhone 6 使用 @2x 而 iPhone 6+ 使用 @3x 供参考 我之前回答过这个问题,这里是link

Here 是另一个关于 IOS 设备(所有设备)中图像缩放的好博客

编辑

关于清除您对 iPhone5 和 6 为何使用 @2x 图像的疑问。 好吧,iPhone5 使用与 iPhone6 相同的图像,即@2x 图像,尽管 iPhone5 将@2x 缩小到自己的极限,因此无需担心这一点。 Xcode 非常有效地处理了这个问题。

【讨论】:

这没有回答问题,即询问如何为 EVERY iOS 设备提供不同的图像 已经编辑了答案,如果它仍然让你感到困惑,那么请评论将很高兴消除困惑 不过,只有 3 个选项(其中一个仅适用于较旧的 iphone,因此实际上是 2 个)存储图像的位置 - 要为每个设备提供不同的图像,需要有 4 个,因为尽管有些设备具有相同的比例因子,但每个设备的像素数量不同 没有办法解决这个问题,如果您想使用图像资源,您必须让 xcode 选择设备并为您选择正确的图像。或者您可以选择单独的故事板来为每个故事板加载不同设备的每个独特图像集。我再次编辑了答案以供您理解 完全正确 - 问题的关键是如何解决这个问题

以上是关于为不同的 iOS 设备使用不同的图像分辨率的主要内容,如果未能解决你的问题,请参考以下文章

iOS - 基于设备的不同图像或缩放相同的图像?

如何实现不同分辨率的图像

为不同的设备/分辨率使用不同的图像,例如如何使用波浪号 (~) 来区分 iPhone 和 iPad?

根据设备宽度和用户带宽提供不同尺寸/分辨率的图像

如何在煎茶触摸中添加不同屏幕分辨率的图像?

iOS 和 Android 应用程序的图像分辨率