美文网首页iOS|Android.全球ios 屏幕适配篇IOS开发路上的故事
iOS屏幕适配-普通机与刘海屏(iPhoneX/XR/XS/XS

iOS屏幕适配-普通机与刘海屏(iPhoneX/XR/XS/XS

作者: 雨_田 | 来源:发表于2018-10-22 00:33 被阅读608次

    简介:根据开发工具Xcode10,硬件:苹果放弃4s/5/5c,从se,5s及以上的手机适配;软件:支持iOS8.0及以上系统适配。

    一、手机识别
    1、硬件编号识别
    一款iPhone除了有IPhone XS、XS Max、XR等这样的对外发布手机编号,还有一套对内的iPhone11,2/11,4/11,8等对应的硬件编号

    #import <sys/utsname.h>
    + (NSString *)DeviceModel {
        struct utsname systemInfo;
        uname(&systemInfo);
        NSString *deviceString = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];
        if ([deviceString isEqualToString:@"iPhone1,1"])    return @"Apple#iPhone 1G";
        if ([deviceString isEqualToString:@"iPhone1,2"])    return @"Apple#iPhone 3G";
        if ([deviceString isEqualToString:@"iPhone2,1"])    return @"Apple#iPhone 3GS";
        if ([deviceString isEqualToString:@"iPhone3,1"])    return @"Apple#iPhone 4";
        if ([deviceString isEqualToString:@"iPhone3,2"])    return @"Apple#iPhone 4 Verizon";
        if ([deviceString isEqualToString:@"iPhone4,1"])    return @"Apple#iPhone 4S";
        if ([deviceString isEqualToString:@"iPhone5,2"])    return @"Apple#iPhone 5";
        if ([deviceString isEqualToString:@"iPhone5,3"])    return @"Apple#iPhone 5c";
        if ([deviceString isEqualToString:@"iPhone5,4"])    return @"Apple#iPhone 5c";
        if ([deviceString isEqualToString:@"iPhone6,1"])    return @"Apple#iPhone 5s";
        if ([deviceString isEqualToString:@"iPhone6,2"])    return @"Apple#iPhone 5s";
        if ([deviceString isEqualToString:@"iPhone7,1"])    return @"Apple#iPhone 6 Plus";
        if ([deviceString isEqualToString:@"iPhone7,2"])    return @"Apple#iPhone 6";
        if ([deviceString isEqualToString:@"iPhone8,1"])    return @"Apple#iPhone 6s";
        if ([deviceString isEqualToString:@"iPhone8,2"])    return @"Apple#iPhone 6s Plus";
        if ([deviceString isEqualToString:@"iPhone8,4"])    return @"Apple#iPhone SE";
        if ([deviceString isEqualToString:@"iPhone9,1"])    return @"Apple#iPhone 7";
        if ([deviceString isEqualToString:@"iPhone9,2"])    return @"Apple#iPhone 7 Plus";
        if ([deviceString isEqualToString:@"iPhone9,3"])    return @"Apple#iPhone 7";
        if ([deviceString isEqualToString:@"iPhone9,4"])    return @"Apple#iPhone 7 Plus";
        if ([deviceString isEqualToString:@"iPhone10,1"])   return @"Apple#iPhone 8 Global";
        if ([deviceString isEqualToString:@"iPhone10,2"])   return @"Apple#iPhone 8 Plus Global";
        if ([deviceString isEqualToString:@"iPhone10,3"])   return @"Apple#iPhone X Global";
        if ([deviceString isEqualToString:@"iPhone10,4"])   return @"Apple#iPhone 8 GSM";
        if ([deviceString isEqualToString:@"iPhone10,5"])   return @"Apple#iPhone 8 Plus GSM";
        if ([deviceString isEqualToString:@"iPhone10,6"])   return @"Apple#iPhone X GSM";
    
        if ([deviceString isEqualToString:@"iPhone11,2"])   return @"Apple#iPhone XS";
        if ([deviceString isEqualToString:@"iPhone11,4"])   return @"Apple#iPhone XS Max (China)";
        if ([deviceString isEqualToString:@"iPhone11,6"])   return @"Apple#iPhone XS Max";
        if ([deviceString isEqualToString:@"iPhone11,8"])   return @"Apple#iPhone XR";
    
        if ([deviceString isEqualToString:@"i386"])         return @"Apple#Simulator 32";
        if ([deviceString isEqualToString:@"x86_64"])       return @"Apple#Simulator 64";
    
        #ifdef  DEBUG
            NSLog(@"NOTE: Unknown device type: %@", deviceString);
        #endif
         return [NSString stringWithFormat:@"Apple#%@",deviceString];
    }
    

    2、屏幕分辨率识别


    iOS分辨率.PNG

    二、刘海屏尺寸pt分布


    iPhoneX系列.png

    三、实际适配宏定义

    /**
     * MARK:-屏幕尺寸宏定义
     * 导航栏高度 状态栏高度 底部tabbar高度 苹果X底部安全区高度
     */
    //屏幕rect
    #define SCREEN_BOUNDS ([UIScreen mainScreen].bounds)
    //屏幕宽度
    #define SCREEN_WIDTH ([UIScreen mainScreen].bounds.size.width)
    //屏幕高度
    #define SCREEN_HEIGHT ([UIScreen mainScreen].bounds.size.height)
    //屏幕分辨率
    #define SCREEN_RESOLUTION (SCREEN_WIDTH * SCREEN_HEIGHT * ([UIScreen mainScreen].scale))
    //iPhone X系列判断
    #define  IS_iPhoneX (CGSizeEqualToSize(CGSizeMake(375.f, 812.f), [UIScreen mainScreen].bounds.size) || CGSizeEqualToSize(CGSizeMake(812.f, 375.f), [UIScreen mainScreen].bounds.size)  || CGSizeEqualToSize(CGSizeMake(414.f, 896.f), [UIScreen mainScreen].bounds.size) || CGSizeEqualToSize(CGSizeMake(896.f, 414.f), [UIScreen mainScreen].bounds.size))
    //状态栏高度
    #define StatusBarHeight (IS_iPhoneX ? 44.f : 20.f)
    //导航栏高度
    #define NavBarHeight (44.f+StatusBarHeight)
    //底部标签栏高度
    #define TabBarHeight (IS_iPhoneX ? (49.f+34.f) : 49.f)
    //安全区域高度
    #define TabbarSafeBottomMargin     (IS_iPhoneX ? 34.f : 0.f)
    

    四、启动图适配


    启动图适配.png

    五、app图标适配


    app图标适配.png

    相关文章

      网友评论

      • 的的可可:写得很好,关注你了哦
        雨_田:@的的可可 :cherry_blossom:
      • Hello_kid:我在xs max上, 我把导航栏隐藏了,自己定义个返回按钮, 怎么让自定义的返回按钮在原来导航栏的位置上,
        雨_田:@码界吴彦祖 自定义个frame(0, 0, SCREEN_WIDTH, NavBarHeight)的view,按钮从view底部往上布局

      本文标题:iOS屏幕适配-普通机与刘海屏(iPhoneX/XR/XS/XS

      本文链接:https://www.haomeiwen.com/subject/yuaizftx.html