文档章节

iphone X系列设配屏幕适配

在人间2018
 在人间2018
发布于 2018/10/10 16:17
字数 696
阅读 101
收藏 0

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

  • 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://www.theiphonewiki.com/wiki/Models

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

参考链接:

© 著作权归作者所有

在人间2018
粉丝 1
博文 23
码字总数 8813
作品 0
海淀
程序员
私信 提问
iPhone屏幕大小和适配建议(包括 XR XS XSM )

X 系列 XR XSM 都和P 一样宽,高度有所增加 XS 和 X 一样 关于适配建议,基本还是依照下面这边文章的原则 iOS 四种iPhone屏幕适配方案(借鉴) 需要注意的是关于带X的(X XR XS XSM),上下都多...

柠檬草YF
2018/09/18
0
0
android 屏幕适配问题

看了很多关于屏幕适配的方法,可是还是没有解决。 我是建文件夹 适配屏幕的,可是现在遇到的问题是:6.1寸 分辨率 1280x720 的手机 适配的始终是 values-mdpi 里面的 适配数值,我已经建了一...

黛曦葛溪
2013/07/18
3K
4
iOS开发之iOS11、iPhone X、Xcode9 适配指南

更新iOS11后,发现有些地方需要做适配,整理后按照优先级分为以下三类: 1.单纯升级iOS11后造成的变化; 2.Xcode9 打包后造成的变化; 3.iPhoneX的适配 一、单纯升级iOS11后造成的变化 1. 升...

ziyuzhiye
2017/10/13
0
0
(转载)iPhoneX适配之UI设计、交互设计

原文地址:http://blog.csdn.net/u011363981/article/details/78011757#reply 前言 苹果近日发布了全新的iPhone X全面屏手机,这也是首款采用OLED屏幕的iPhone手机,它的正面设计被更多人吐槽...

小曼study
2017/10/23
0
0
iPhone X 适配 ( iOS 11适配 ) 打理刘海

这是一个故事: 故事背景 iPhone X 刘海机于9月份发布以来,备受诟病,给科技带来一个宴会.给coder却带来一份淡淡的凉意---> 怎么适配呢? 我们的APP会不会被遮住,多出来一个刘海? 我们底下的Tab...

iOS_xuanhe
2017/12/08
0
0

没有更多内容

加载失败,请刷新页面

加载更多

日志相关---日志配置和过滤器

一、log4j日志简介 1.1、 Loggers 级别和介绍 Loggers组件在此系统中被分为八个级别:ALL、TRANCE、DEBUG、INFO、WARN、ERROR和FATAL、OFF。这八个级别是有顺序的, ##off表示关闭ALL < T...

spinachgit
23分钟前
1
0
六个面试题层层剖析——LongAddr原子类

并发编程面试题 (1)LongAddr的结构是怎样的? (2)当前线程应该访问Cell数组里面的哪一个Cell元素? (3)如何初始化Cell数组? (4)Cell数组如何扩容? (5)线程访问分配的Cell元素有冲...

须臾之余
25分钟前
8
0
MySQL-入门(二)

本部分主要是MySQL的常用函数和高级用法。 一、MySQL排序 排序关键字:order by 排序字段。后面写上要排序字段,排序字段可以有多个,多个采用逗号间隔,order by默认采用升序(asc)排序,可...

潜行-L
36分钟前
3
0
BAM转VCF的方法对比

1 使用GATK HaplotypeCaller #java -jar gatk.jar HaplotypeCaller --native-pair-hmm-threads 4 -R xx.fa -I xx.bam -O xx.vcf --native-pair-hmm-threads用来设置多线程,默认为4线程 2 sa......

悲催的古灵武士
44分钟前
2
0
软件架构设计原则之“KISS”的总结使用

今天聊一聊软件架构设计中的 KISS 原则。 对! 就是亲嘴的那个 “KISS”! 一定要多练习。 ... ... ... ... 作为一个程序员我是推荐理解为“亲嘴”的,可以很好的解决单身问题,但作为一个架...

Owen_Jia
46分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部