以点值检测iPhone 6/6 +屏幕尺寸

das*_*ist 59 iphone ios ios8

鉴于最新发布的iPhone 6 屏幕尺寸:

iPhone 6: 1334h * 750w @2x (in points: 667h * 375w)
iPhone 6+: 1920 * 1080 @3x (in points: 640h * 360w)
Run Code Online (Sandbox Code Playgroud)

我想知道是否有代码允许我检测用户设备的屏幕尺寸,以便我可以UIImages使用用户的设备相应地调整和调整尺寸和其他材料.

到目前为止,我一直在使用以下内容:

- (NSString *) platform{
    size_t size;
    sysctlbyname("hw.machine", NULL, &size, NULL, 0);
    char *machine = malloc(size);
    sysctlbyname("hw.machine", machine, &size, NULL, 0);
    NSString *platform = [NSString stringWithUTF8String:machine];
    free(machine);
    return platform;
}

- (NSString *) platformString{
    NSString *platform = [self platform];
    if ([platform isEqualToString:@"iPhone1,1"])    return @"iPhone 1G";
    if ([platform isEqualToString:@"iPhone1,2"])    return @"iPhone 3G";
    if ([platform isEqualToString:@"iPhone2,1"])    return @"iPhone 3GS";
    if ([platform isEqualToString:@"iPhone3,1"])    return @"iPhone 4";
    if ([platform isEqualToString:@"iPhone3,3"])    return @"Verizon iPhone 4";
    if ([platform isEqualToString:@"iPhone4,1"])    return @"iPhone 4S";
    if ([platform isEqualToString:@"iPhone5,1"])    return @"iPhone 5 (GSM)";
    if ([platform isEqualToString:@"iPhone5,2"])    return @"iPhone 5 (GSM+CDMA)";
    if ([platform isEqualToString:@"iPhone5,3"])    return @"iPhone 5c (GSM)";
    if ([platform isEqualToString:@"iPhone5,4"])    return @"iPhone 5c (GSM+CDMA)";
    if ([platform isEqualToString:@"iPhone6,1"])    return @"iPhone 5s (GSM)";
    if ([platform isEqualToString:@"iPhone6,2"])    return @"iPhone 5s (GSM+CDMA)";
    if ([platform isEqualToString:@"iPod1,1"])      return @"iPod Touch 1G";
    if ([platform isEqualToString:@"iPod2,1"])      return @"iPod Touch 2G";
    if ([platform isEqualToString:@"iPod3,1"])      return @"iPod Touch 3G";
    if ([platform isEqualToString:@"iPod4,1"])      return @"iPod Touch 4G";
    if ([platform isEqualToString:@"iPod5,1"])      return @"iPod Touch 5G";
    if ([platform isEqualToString:@"iPad1,1"])      return @"iPad";
    if ([platform isEqualToString:@"iPad2,1"])      return @"iPad 2 (WiFi)";
    if ([platform isEqualToString:@"iPad2,2"])      return @"iPad 2 (GSM)";
    if ([platform isEqualToString:@"iPad2,3"])      return @"iPad 2 (CDMA)";
    if ([platform isEqualToString:@"iPad2,4"])      return @"iPad 2 (WiFi)";
    if ([platform isEqualToString:@"iPad2,5"])      return @"iPad Mini (WiFi)";
    if ([platform isEqualToString:@"iPad2,6"])      return @"iPad Mini (GSM)";
    if ([platform isEqualToString:@"iPad2,7"])      return @"iPad Mini (GSM+CDMA)";
    if ([platform isEqualToString:@"iPad3,1"])      return @"iPad 3 (WiFi)";
    if ([platform isEqualToString:@"iPad3,2"])      return @"iPad 3 (GSM+CDMA)";
    if ([platform isEqualToString:@"iPad3,3"])      return @"iPad 3 (GSM)";
    if ([platform isEqualToString:@"iPad3,4"])      return @"iPad 4 (WiFi)";
    if ([platform isEqualToString:@"iPad3,5"])      return @"iPad 4 (GSM)";
    if ([platform isEqualToString:@"iPad3,6"])      return @"iPad 4 (GSM+CDMA)";
    if ([platform isEqualToString:@"iPad4,1"])      return @"iPad Air (WiFi)";
    if ([platform isEqualToString:@"iPad4,2"])      return @"iPad Air (Cellular)";
    if ([platform isEqualToString:@"iPad4,4"])      return @"iPad mini 2G (WiFi)";
    if ([platform isEqualToString:@"iPad4,5"])      return @"iPad mini 2G (Cellular)";
    if ([platform isEqualToString:@"i386"])         return @"Simulator";
    if ([platform isEqualToString:@"x86_64"])       return @"Simulator";
    return platform;
}
Run Code Online (Sandbox Code Playgroud)

因此,我应该假设iPhone7,1并且iPhone7,2是iPhone 6 iPhone7,3而且iPhone7.4是优点吗?如果有人有更具体的方式告诉它会很棒,谢谢!

Han*_*son 102

第一个屏幕将是设备屏幕,请注意,之前必须添加新手机的启动图像,否则应用程序将在Zoomed模式下运行以用于较旧的应用程序:以下是我用来检查此问题的代码.注意:这仅适用于iOS 8及更高版本:

UIScreen *mainScreen = [UIScreen mainScreen];
NSLog(@"Screen bounds: %@, Screen resolution: %@, scale: %f, nativeScale: %f",
          NSStringFromCGRect(mainScreen.bounds), mainScreen.coordinateSpace, mainScreen.scale, mainScreen.nativeScale);
Run Code Online (Sandbox Code Playgroud)

检测iPhone 6 Plus的代码:

#define IS_PAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
#define IS_PHONE (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)

-(BOOL)iPhone6PlusDevice{
    if (!IS_PHONE) return NO;
    if ([UIScreen mainScreen].scale > 2.9) return YES;   // Scale is only 3 when not in scaled mode for iPhone 6 Plus
    return NO;
}
Run Code Online (Sandbox Code Playgroud)

要么

-(BOOL) iPhone6PlusUnZoomed{
    if ([self iPhone6PlusDevice]){
        if ([UIScreen mainScreen].bounds.size.height > 720.0) return YES;  // Height is 736, but 667 when zoomed.
    }
    return NO;
}
Run Code Online (Sandbox Code Playgroud)

注意:如果您要检查iPhone 6 Plus,要调整用户界面然后不要依赖.nativeScale,因为模拟器和实际设备会给出不同的结果.由于下面的评论.Scale是一个CGFloat,因此代码不应该检查相等性,因为一些浮点值可能永远不会相等.


添加启动屏幕后,您可以使用新的iPhone尺寸,否则您的应用程序仍将看起来缩放.

更新了新的iPhone X,X和X Max

大小为iPhone X最大值@ 3×缩放(苹果名:超级视网膜HD 6.5显示"),坐标空间:414 X 896点和1242 X 2688个像素,458 PPI,设备的物理尺寸是在3.05 X 6.20或77.4 X157.5毫米.

let screen = UIScreen.main
print("Screen bounds: \(screen.bounds), Screen resolution: \(screen.nativeBounds), scale: \(screen.scale)")
//iPhone X Max Screen bounds: (0.0, 0.0, 414.0, 896.0), Screen resolution: (0.0, 0.0, 1242.0, 2688.0), scale: 3.0
Run Code Online (Sandbox Code Playgroud)

大小为iPhone X@ 2X缩放(苹果名:超级视网膜HD 6.1"显示器),坐标空间:414 X 896点和828 X 1792像素,326 PPI,设备的物理尺寸是在2.98 X 5.94或75.7 X150.9毫米.

let screen = UIScreen.main
print("Screen bounds: \(screen.bounds), Screen resolution: \(screen.nativeBounds), scale: \(screen.scale)")
//iPhone X Screen bounds: (0.0, 0.0, 414.0, 896.0), Screen resolution: (0.0, 0.0, 828.0, 1792.0), scale: 2.0
Run Code Online (Sandbox Code Playgroud)

尺寸为iPhone XiPhone X,缩放比例为3倍(Apple名称:Super Retina HD 5.8"显示屏),坐标空间:375 x 812点和1125 x 2436像素,458 ppi,设备物理尺寸为2.79 x 5.65英寸或70.9 x 143.6毫米.

let screen = UIScreen.main
print("Screen bounds: \(screen.bounds), Screen resolution: \(screen.nativeBounds), scale: \(screen.scale)")
//iPhone X and X Screen bounds: (0.0, 0.0, 375.0, 812.0), Screen resolution: (0.0, 0.0, 1125.0, 2436.0), scale: 3.0
Run Code Online (Sandbox Code Playgroud)

尺寸适用于iPhone 8,7,6 PlusiPhone 8,7,6S Plus,尺寸为@ 3x(Apple名称:Retina HD 5.5),坐标空间:414 x 736点和1242 x 2208像素,401 ppi,屏幕物理尺寸为2.7 x 4.8英寸或68 x 122毫米:

Screen bounds: {{0, 0}, {414, 736}}, Screen resolution: <UIScreen: 0x7f97fad330b0; bounds = {{0, 0}, {414, 736}}; 
mode = <UIScreenMode: 0x7f97fae1ce00; size = 1242.000000 x 2208.000000>>, scale: 3.000000, nativeScale: 3.000000
Run Code Online (Sandbox Code Playgroud)

尺寸为iPhone 6iPhone 6S,缩放比例为@ 2x(Apple名称:Retina HD 4.7),坐标空间:375 x 667点,750 x 1334像素,326 ppi,屏幕物理尺寸为2.3 x 4.1英寸或58 x 104毫米:

Screen bounds: {{0, 0}, {375, 667}}, Screen resolution: <UIScreen: 0x7fa01b5182d0; bounds = {{0, 0}, {375, 667}}; 
mode = <UIScreenMode: 0x7fa01b711760; size = 750.000000 x 1334.000000>>, scale: 2.000000, nativeScale: 2.000000
Run Code Online (Sandbox Code Playgroud)

iPhone 5相比,它是640 x 1136,iPhone 4 640 x 960.

注意:上传LaunchImages,否则应用程序将运行缩放,并且不会显示正确的缩放比例或屏幕大小.

比较iPhone 6和6 Plus

  • 将浮点数设置为3.0与值3.0进行比较......它们都是浮点数,因此当以二进制表示时,两者都会"遭受"相同的精度损失..scale == 3.0是要使用的有效(和清晰)比较 (3认同)
  • @daspianist我在为新手机添加启动图像后更新了我的评论,否则模拟器在旧版应用程序的缩放模式下运行,因此,之前的分辨率未显示. (2认同)

小智 32

如果您更喜欢宏,那么您可以使用这些宏来区分iPhone型号.这些是基于点值.

#define IS_IPHONE_4 (fabs((double)[[UIScreen mainScreen]bounds].size.height - (double)480) < DBL_EPSILON)
#define IS_IPHONE_5 (fabs((double)[[UIScreen mainScreen]bounds].size.height - (double)568) < DBL_EPSILON)
#define IS_IPHONE_6 (fabs((double)[[UIScreen mainScreen]bounds].size.height - (double)667) < DBL_EPSILON)
#define IS_IPHONE_6_PLUS (fabs((double)[[UIScreen mainScreen]bounds].size.height - (double)736) < DBL_EPSILON)
Run Code Online (Sandbox Code Playgroud)


Rol*_*som 18

我使用以下代码来确定正在运行的设备(它有点快速和脏,但它可以解决问题)

if( UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone ){

    CGFloat screenHeight = [UIScreen mainScreen].bounds.size.height;
    CGFloat screenWidth = [UIScreen mainScreen].bounds.size.width;
    if( screenHeight < screenWidth ){
        screenHeight = screenWidth;
    }

    if( screenHeight > 480 && screenHeight < 667 ){
        NSLog(@"iPhone 5/5s");
    } else if ( screenHeight > 480 && screenHeight < 736 ){
        NSLog(@"iPhone 6");
    } else if ( screenHeight > 480 ){
        NSLog(@"iPhone 6 Plus");
    } else {
        NSLog(@"iPhone 4/4s");
    }
}
Run Code Online (Sandbox Code Playgroud)

(仅当通过添加适当的启动屏幕启用iPhone 6/6 Plus时才有效)


Jer*_*oia 5

在物理设备上,iPhone 6 Plus的主屏幕界限为2208x1242,nativeBounds为1920x1080.需要硬件缩放才能调整大小以适应物理显示.

在模拟器上,iPhone 6 Plus的主屏幕边界和nativeBounds均为2208x1242.

换句话说......视频,OpenGL和基于处理像素的CALayers的其他东西将处理设备上的真实1920x1080帧缓冲(或SIM上的2208x1242).处理UIKit中的点的事情将处理2208x1242(x3)边界并在设备上适当缩放.

模拟器无法访问在设备上进行扩展的相同硬件,并且在软件中模拟它并没有太大的好处,因为它们产生的结果与硬件不同.因此,将模拟设备的主屏幕的nativeBounds设置为物理设备主屏幕的边界是有意义的.

iOS 8为UIScreen(nativeScale和nativeBounds)添加了API,让开发人员确定与UIScreen相对应的CADisplay的分辨率.


use*_*236 5

检查wiki上的更新列表,我有iPhone 6的7,2和iPhone 6的7,1.