UIScreen获取两种类型画面尺寸

本文介绍了在iOS开发中如何使用Objective-C来获取设备的主屏幕尺寸和应用可用尺寸,包括排除状态栏占用的空间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    // [[UIScreen mainScreen] bounds]返回的是画面整个尺寸
    NSLog(@"%f=====%f",[[UIScreen mainScreen] bounds].size.width,[[UIScreen mainScreen] bounds].size.height);

    // [[UIScreen mainScreen] applicationFrame]返回的是除了状态条所占空间以外的尺寸
    NSLog(@"%f=====%f",[[UIScreen mainScreen] applicationFrame].size.width,[[UIScreen mainScreen] applicationFrame].size.height);
<think>我们参考用户的问题和提供的引用内容,用户需要获取iOS设备的屏幕尺寸信息。 根据引用[2],我们可以知道屏幕尺寸信息可以通过设备的逻辑分辨率和缩放因子(Scale)来计算出物理分辨率,然后根据物理分辨率和像素密度(PPI)可以计算出屏幕尺寸(英寸)。但是,用户直接询问的是如何获取屏幕尺寸,而实际上在iOS开发中,我们通常不直接计算屏幕尺寸,而是获取屏幕的分辨率和缩放因子,然后通过公式计算(如果需要的话)。 然而,在iOS开发中,我们通常使用UIScreen类来获取屏幕的相关信息。屏幕尺寸(英寸)并不是一个直接通过API获取的值,但我们可以通过设备的型号来间接获取(如引用[1]中提到的,有人整理了所有设备的规格信息)。不过,用户可能更关心的是如何通过代码获取当前设备的屏幕尺寸(以英寸为单位),但苹果并没有直接提供这样的API。 因此,我们可以考虑以下两种方式: 1. 通过获取设备的型号标识符(如"iPad6,7"),然后查找预存的数据表(如引用[1]和[2]中提到的表格)来获取屏幕尺寸。 2. 通过屏幕的物理分辨率和像素密度来计算屏幕尺寸(需要知道PPI,而PPI也可以通过设备型号在预存数据中获取)。 但是,在iOS开发中,我们通常不需要直接获取屏幕尺寸(英寸),而是使用点(points)和缩放因子来布局。如果用户需要的是以点为单位的大小,那么可以直接使用UIScreenbounds或nativeBounds。 然而,用户的问题明确要求“屏幕尺寸”,通常指的是以英寸为单位的屏幕对角线长度。 考虑到以上,我们给出两种方案: 方案一:通过设备型号标识符匹配预存数据(推荐,因为苹果官方不提供直接获取英寸的API) 步骤: 1. 获取设备的型号标识符(例如:iPhone10,3 对应 iPhone X) 2. 从本地或远程获取一个设备型号与屏幕尺寸的映射表(如引用[2]中给出的表格) 3. 根据型号标识符查找对应的屏幕尺寸 方案二:通过计算(需要知道PPI,而PPI同样需要查表,所以实际上还是需要预存数据) 公式:屏幕尺寸(英寸)= √(宽度² + 高度²) / PPI 其中,宽度和高度是物理像素(需要获取屏幕的物理分辨率),PPI(每英寸像素数)同样需要根据设备型号查表。 因此,无论哪种方式,都需要一个设备型号与规格的映射表。由于苹果没有提供官方的API,我们只能自己维护这个表。 下面我们给出方案一的代码示例: 首先,获取设备型号标识符: 我们可以使用`uname`函数获取设备型号标识符,然后映射到屏幕尺寸。 但是,请注意:苹果不允许App获取设备型号名称(如iPhone X),但允许获取设备型号标识符(如iPhone10,3)。我们可以通过这个标识符来匹配。 我们可以创建一个plist文件,存储设备型号标识符到屏幕尺寸的映射。例如: "iPhone10,3": 5.8, "iPhone10,6": 5.8, "iPad6,3": 9.7, ... 然后,在代码中: 1. 获取设备型号标识符 2. 在plist中查找对应的屏幕尺寸 获取设备型号标识符的方法: ```objective-c #include <sys/utsname.h> - (NSString *)deviceModelIdentifier { struct utsname systemInfo; uname(&systemInfo); return [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding]; } ``` 或者Swift: ```swift func deviceModelIdentifier() -> String { var systemInfo = utsname() uname(&systemInfo) let machineMirror = Mirror(reflecting: systemInfo.machine) let identifier = machineMirror.children.reduce("") { identifier, element in guard let value = element.value as? Int8, value != 0 else { return identifier } return identifier + String(UnicodeScalar(UInt8(value))) } return identifier } ``` 然后,我们有一个映射表(可以在代码中内置一个字典,或者从plist读取),例如: 在Swift中: ```swift let deviceSizes: [String: Double] = [ "iPhone10,3": 5.8, // iPhone X "iPhone10,6": 5.8, // iPhone X "iPhone11,2": 5.8, // iPhone XS "iPhone11,4": 6.5, // iPhone XS Max "iPhone11,6": 6.5, // iPhone XS Max "iPhone11,8": 6.1, // iPhone XR // ... 其他设备 "iPad6,3": 9.7, // iPad Pro 9.7-inch "iPad6,4": 9.7, "iPad6,7": 12.9, // iPad Pro 12.9-inch "iPad6,8": 12.9, // ... 更多设备 ] func getScreenSizeInInch() -> Double? { let identifier = deviceModelIdentifier() return deviceSizes[identifier] } ``` 但是,这种方法需要维护一个完整的设备列表,因为设备型号标识符会随着新设备的发布而增加。 另外,引用[3]提到了使用AutoLayout进行不同屏幕尺寸的匹配,但这与获取屏幕尺寸(英寸)无关,而是关于界面布局适配。 综上所述,我们建议使用设备型号标识符映射到屏幕尺寸的方法,并提醒用户需要自己维护这个映射表。 因此,回答如下:</think>在 iOS 开发中获取设备屏幕尺寸(以英寸为单位)需要结合硬件标识符查询预存数据,因为苹果官方未提供直接获取屏幕物理尺寸的 API。以下是具体实现方法: ### 实现步骤 1. **获取设备硬件标识符** 使用 `uname` 系统调用获取设备型号编码(如 `iPhone14,2`): ```swift func deviceIdentifier() -> String { var systemInfo = utsname() uname(&systemInfo) let mirror = Mirror(reflecting: systemInfo.machine) return mirror.children.compactMap { guard let value = $0.value as? Int8, value != 0 else { return nil } return String(UnicodeScalar(UInt8(value))) }.joined() } ``` 2. **创建设备尺寸映射表** 参考维护完整的设备规格数据库(如 [Blake’s iOS Device Specifications Grid](https://blakespot.com/ios_device_specifications_grid.html)),在代码中建立映射字典: ```swift let deviceSizeMap: [String: Double] = [ // iPhone 示例 "iPhone14,2": 6.1, // iPhone 13 Pro "iPhone14,3": 6.7, // iPhone 13 Pro Max "iPhone15,2": 6.1, // iPhone 14 Pro // iPad 示例 "iPad13,1": 10.2, // iPad 9th "iPad14,1": 10.9 // iPad Air 5th ] ``` 3. **获取屏幕尺寸** 通过标识符查询映射表: ```swift func screenSizeInInches() -> Double? { let identifier = deviceIdentifier() return deviceSizeMap[identifier] } ``` ### 关键说明 1. **物理尺寸计算原理** 屏幕尺寸通过公式计算: $$\text{尺寸(英寸)} = \frac{\sqrt{\text{宽}^2 + \text{高}^2}}{\text{PPI}}$$ 其中宽/高为物理像素值(需从 `UIScreen.main.nativeBounds` 获取),PPI 需查表[^2]。 2. **动态更新建议** - 在应用启动时从服务端拉取最新的 `deviceSizeMap` 数据 - 使用开源库如 [DeviceKit](https://github.com/devicekit/DeviceKit)(已维护 500+ 设备数据) 3. **屏幕尺寸分类** 对于布局适配,更推荐使用 Apple 官方的尺寸分类: ```swift let traits = UIScreen.main.traitCollection if traits.horizontalSizeClass == .regular { // iPad 或大屏 iPhone 布局 } ``` ### 注意事项 - 苹果禁止直接访问硬件参数,此方案需自行维护设备数据库 - 新机型发布后需更新映射表(通常滞后 1-2 周) - 模拟器返回的标识符为 `x86_64`,需特殊处理 > 完整设备规格参考:[Blake’s iOS Device Specifications Grid](https://blakespot.com/ios_device_specifications_grid.html) [^1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值