使用SwiftUI跨多个iOS设备显示具有精确尺寸的标尺图像

使用SwiftUI跨多个iOS设备显示具有精确尺寸的标尺图像,ios,swift,swiftui,user-experience,image-size,Ios,Swift,Swiftui,User Experience,Image Size,我正在寻找一种方法,用英寸或毫米来定义图像的大小,而不是点或像素。我想在白色背景上显示标尺的图像。无论使用哪种设备(如iPad air、iPad pro、iPhone se、iPhone 11、iPhone 11 pro等),我都希望屏幕上的图像在使用物理标尺测量时填充一致的尺寸 我看到过一些解决方案,这些解决方案的核心是为每台设备创建单独的映像,但我很高兴发现一种方法,可以用于在所有iOS设备上扩展单个映像的大小 如果我的任何语言有错误或令人困惑,请随时指出/要求澄清。我是一个热衷于批评的绿色

我正在寻找一种方法,用英寸或毫米来定义图像的大小,而不是点或像素。我想在白色背景上显示标尺的图像。无论使用哪种设备(如iPad air、iPad pro、iPhone se、iPhone 11、iPhone 11 pro等),我都希望屏幕上的图像在使用物理标尺测量时填充一致的尺寸

我看到过一些解决方案,这些解决方案的核心是为每台设备创建单独的映像,但我很高兴发现一种方法,可以用于在所有iOS设备上扩展单个映像的大小


如果我的任何语言有错误或令人困惑,请随时指出/要求澄清。我是一个热衷于批评的绿色开发人员。

一般来说,这比应该的要难。苹果不希望你为特定的设备设计接口,但是对于这个应用程序,你必须知道你正在运行的特定设备,这样你就可以查找该设备的每英寸点数。当我说查找时,您需要提供自己的表(字典),该表将设备名称映射到每英寸点数

第一件事。如何获取设备名称

您可以拨打以下电话:

ui设备.当前.名称

要查找各种设备返回的内容,请运行以下命令:

struct ContentView: View {

    var body: some View {
        HStack {
            Text(UIDevice.current.name)
        }
    }
}
在各种设备模拟器上查找它们返回的内容。最近推出的一些产品包括
“iPhone11Pro Max”
“iPhone11Pro”
“iPhone11”
“iPadPro(12.9英寸)(第四代)”

在SwiftUI中,指定帧大小时,使用的是点,而不是像素。因此,您需要知道所有设备的每英寸点数

包含关于许多设备及其分辨率和点尺寸的大量信息。通过一些工作,您可以导出各种设备的每英寸点数。在大多数情况下,每英寸点数仅为每英寸像素数除以图像资源乘数(
@2x
@3x
)。例外的是5.5英寸的iPhone(6S+,7+,7S+,8+),它们的分辨率没有应有的高,因此还有一个额外的
1.15
比例因子

一旦获得每英寸点数,我建议创建一个字典,将设备名称映射到每英寸点数

最后,你会有一些标尺的图像。你会希望在你的图像资产中提供这些图像的@2x和@3x版本。我建议对@2x图像使用326 ppi,对@3x图像使用458 ppi。iOS会自动加载适合你设备的@2x或@3x版本


在应用程序中,您可以查找设备名称,然后使用字典查找每英寸点数。然后,您可以将每英寸点数乘以将显示的图像大小(例如,12英寸标尺将是每英寸点数*12)。这将为您的图像提供用于帧大小的点尺寸。

谢谢,这个答案非常好!我本来希望苹果能提供一个“一刀切”的工具,但这次看来我不会偷懒。也就是说,您在获得更多手动/自定义解决方案方面做了大量的工作。我很容易看到h现在只需做一点工作,整个过程就可以抽象成一个通用工具(框架?功能?对不起,我真的很新)。简单地说,我想说的是,一旦构建,您的解决方案看起来非常可重用。谢谢。
let pointsPerInch: [String : CGFloat] = [
    "iPhone 8": 163,                               // 326 ppi / 2
    "iPhone 8 Plus": 153.716,                      // 401 ppi * 1.15 / 3
    "iPhone 11": 163,                              // 326 ppi / 2
    "iPhone 11 Pro": 152.66,                       // 458 ppi / 3
    "iPhone 11 Pro Max": 152.66,                   // 458 ppi / 3
    "iPad Pro (12.9-inch) (4th generation)": 132   // 264 ppi / 2
]