博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iphone X系列设配屏幕适配
阅读量:6982 次
发布时间:2019-06-27

本文共 2710 字,大约阅读时间需要 9 分钟。

hot3.png

截止目前,苹果所有刘海系列的设备屏幕数据如下:

  • iPhone X 、iPhone XS: 5.8英寸, 375pt * 812pt(@3x),启动图1125px * 2436px
  • iPhone XR: 6.1英寸, 414pt * 896pt(@2x),启动图828px * 1792px
  • iPhone XS Max: 6.5英寸, 414pt * 896pt(@3x),启动图1242px * 2688px

该系列设备导航栏高度88(64), 状态栏高度44(20), tabbar高度83(49), 其中括号中的为非刘海系列的高度。

对于未进行新设备屏幕尺寸适配的工程,在新设备iPhone XS Max和iPhone XR上运行, 它们是以放大模式自动适配的(以iPhone X为基准等比例放大),此时在代码中获取的屏幕高度都是375pt * 812pt。

针对这种情况,需要配置Assets.xcassets 里的 LaunchImage,新增两种828px * 1792px1242px * 2688px启动图即可。

对于比较新的以LaunchScreen.stroyboard为启动页的,据说是直接重新编译工程即可。

最后,对于刘海屏幕的判断,项目中使用了两种方式:

  1. 根据屏幕宽高进行判断:

    这是RN中用来判断的代码,使用nativeBounds是由于它是一个跟屏幕朝向无关的数据,值恒等于屏幕portrait-up方向时的宽高。

    static BOOL RCTIsIPhoneX() {  static BOOL isIPhoneX = NO;  static dispatch_once_t onceToken;  dispatch_once(&onceToken, ^{    CGSize screenSize = [UIScreen mainScreen].nativeBounds.size;    CGSize iPhoneXScreenSize = CGSizeMake(1125, 2436);    CGSize iPhoneXMaxScreenSize = CGSizeMake(1242, 2688);    CGSize iPhoneXRScreenSize = CGSizeMake(828, 1792);    isIPhoneX =    CGSizeEqualToSize(screenSize, iPhoneXScreenSize) ||    CGSizeEqualToSize(screenSize, iPhoneXMaxScreenSize) ||    CGSizeEqualToSize(screenSize, iPhoneXRScreenSize);  });  return isIPhoneX;}
  2. 通过获取设备的device model来判断:

    每一台iOS设备都有对应的硬件编码/标识符,称为device model 或者叫machine name,代码如下

    + (NSString *)getMachine{	//方法一://    static const char MachineName[] = "hw.machine";//    NSString* result = nil;//    size_t size = 0;//    if (sysctlbyname(MachineName, NULL, &size, NULL, 0) || size == 0)//        return nil;//    char *machine = new char[size];//    if (sysctlbyname(MachineName, machine, &size, NULL, 0) == 0)//        result = [NSString stringWithUTF8String:machine];//    delete[] machine;//    return result;    方法二:添加了对于模拟器的支持    static NSString *model;    static dispatch_once_t onceToken;    dispatch_once(&onceToken, ^{#if TARGET_IPHONE_SIMULATOR#ifdef DEBUG        // 获取模拟器所对应的 device model        model = NSProcessInfo.processInfo.environment[@"SIMULATOR_MODEL_IDENTIFIER"];#endif#else        // 获取真机设备的 device model        struct utsname systemInfo;        uname(&systemInfo);        model = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];#endif    });    return model;}

    到此我们就可以根据device model来判断是否是iPhone X了:

    + (bool) isIphoneX{    NSString* model = [self getMachine];    BOOL isiPhoneX = [model isEqualToString:@"iPhone10,3"] || [model isEqualToString:@"iPhone10,6"] || [model hasPrefix:@"iPhone11,"];    return isiPhoneX;}

去年发布的第一代 iPhone X 对应的 device mode 为 iPhone10,3iPhone10,6,而今年最新发布 iPhone XS 对应 iPhone11,2,iPhone XS Max 对应 iPhone11,4iPhone11,6,iPhone XR 对应 iPhone11,8,完整的 device mode 数据参考这里:

另外对于各个屏幕的分辨率,可以参考这张图:

参考链接:

转载于:https://my.oschina.net/u/1473377/blog/2239955

你可能感兴趣的文章
20061025: 用上了 ClearType 字体
查看>>
20单位均线,是交易的生命线。
查看>>
Merge Two Sorted Lists
查看>>
黑盒测试用例编写规范(一)
查看>>
EAI Bridges简介
查看>>
checkbox全选/全不选,子复选框全选父复选框选中
查看>>
12.2第一周总结
查看>>
nginx-2-nginx的反向代理
查看>>
vim编辑器
查看>>
Constructor&object 的联系与区别
查看>>
Mysql--变量
查看>>
单引号插入数据库
查看>>
Oracle备份和恢复
查看>>
bzoj千题计划128:bzoj4552: [Tjoi2016&Heoi2016]排序
查看>>
bzoj千题计划157:bzoj1220:[HNOI2002]跳蚤
查看>>
bzoj千题计划212:bzoj1864: [Zjoi2006]三色二叉树
查看>>
Android开发之ProgressDialog在独立Thread线程中更新进度
查看>>
Objective-C内存管理机制
查看>>
数据结构化与保存
查看>>
图片内容保存到数据库,并从数据库里获取图片
查看>>