过了好久,今天终于有时间总结一下适配iPhone X相关的坑,总的来说有两类坑,一个是导航栏+状态栏的高度发生了变化,一个是一些没有实现实现-tableView: viewForHeaderInSection:和-tableView: viewForFooterInSection:等代理方法的UITableView会出错位的问题。

1. 判断是否iPhone X:返回YES或NO

1.1 判断:宏

(1)依据屏幕分辨率

  • 三目运算法

1
2
//是否iPhoneX YES:iPhoneX屏幕 NO:传统屏幕
#define kIs_iPhoneX ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake( 1125 2436 ), [[UIScreen mainScreen] currentMode].size) : NO)

  • 多行逻辑判断

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//是否iPhoneX 1:iPhoneX屏幕 0:传统屏幕
#define kIs_iPhoneX_test ({\
int  tmp =  0 ;\
if  ([UIScreen instancesRespondToSelector:@selector(currentMode)]) {\
     if  (CGSizeEqualToSize(CGSizeMake( 1125 2436 ), [[UIScreen mainScreen] currentMode].size)) {\
         tmp =  1 ;\
     } else {\
         tmp =  0 ;\
     }\
} else {\
     tmp =  0 ;\
}\
tmp;\
})

  • 其中,反斜杠\并不是注释或者其它的无用符号,其实是多行宏换行必须要用的标志。

  • 最后一句tmp;\也是必须的,因为要将经过逻辑判断得到的tmp作为该宏的返回值。

(2)依据屏幕尺寸

1
2
3
#define kIs_iPhoneX (kSCREEN_WIDTH ==  375 .f && kSCREEN_HEIGHT ==  812 .f)
#define kSCREEN_WIDTH  ([UIScreen mainScreen].bounds.size.width)
#define kSCREEN_HEIGHT ([UIScreen mainScreen].bounds.size.height)

1.2 判断:方法

  • 方法:依据设备型号

1
2
3
4
5
6
7
8
9
10
11
+(BOOL)getIs_iPhoneX{
     struct utsname systemInfo;
     uname(&systemInfo);
     NSString *platform = [NSString stringWithCString: systemInfo.machine encoding:NSASCIIStringEncoding];
     
     if ([platform isEqualToString:@ "iPhone10,3" ]||[platform isEqualToString:@ "iPhone10,6" ]) {
         return  YES;
     } else {
         return  NO;
     }
}

2. 灵活返回状态栏+导航栏的高度

需求:灵活得到导航栏+状态栏的高度,作为一个子视图Y轴的起点。

  • 宏定义

1
#define kStatusBarAndNavigationBarHeight (kIs_iPhoneX ?  88 .f :  64 .f)
  • 调用范例

1
2
//自动适配
_segmentedControl.frame = CGRectMake( 0 , kStatusBarAndNavigationBarHeight, kSCREEN_WIDTH,  55 );

3. 拓展:获得iOS系统与App版本信息

  • 获取iOS系统版本号:返回字符串

1
2
3
+ (NSString *)getSystemVersion{
     return  [[UIDevice currentDevice] systemVersion];
}

  • 获取App版本号:返回字符串

1
2
3
4
5
6
+ (NSString *)getAppVersion{
     NSDictionary *infoDic = [[NSBundle mainBundle] infoDictionary];
     // 获取App的版本号
     NSString *appVersion = [infoDic objectForKey:@ "CFBundleShortVersionString" ];
     return  appVersion;
}

4. 适配iPhone X的其他问题

适配iPhone X和Xcode 9的过程中,除了与导航栏相关的问题,还有一个问题经常出现,就是UITableView相关的问题。下面两个办法可以解决多数错位的问题。

  • VC创建tableView属性的时候这样设置

1
2
3
self.tableView.estimatedRowHeight =  0 ;
self.tableView.estimatedSectionHeaderHeight =  0 ;
self.tableView.estimatedSectionFooterHeight =  0 ;

  • 还可以这样设置

1
2
3
4
//cell自适应高度
self.tableView.rowHeight = UITableViewAutomaticDimension;
//预估行高
self.tableView.estimatedRowHeight =  44 .0f;

  • 关于根视图的安全区

iOS新增了个safeArea,原来的老代码中,规定子视图跟根子视图的关系的代码需要新增一个判断:当iOS 11时,需要改为子视图跟根子视图的安全区的关系。这样就不会在iPhone X的底部虚拟home有任何控件干扰了。

1
2
3
4
5
if  (@available(iOS  11.0 , *)) {
     make.edges.equalTo(self.view.safeAreaInsets)
else  {
     make.edges.equalTo(self.view)
}

当然,一般除了tabbar不能放在这个底部虚拟home区,其它的视图tableView视图或者网页视图时可以放在底部虚拟home区中的。这时候,不需要强调必须把子视图放在safeArea之内,原来的老代码也就不用改。

适配iPhoneX常用的宏定义及方法相关推荐

  1. 来,看看这20个常用的宏定义!

    关注.星标公众号,直达精彩内容 ID:技术让梦想更伟大 作者:李肖遥 写好C语言,漂亮的宏定义很重要,使用宏定义可以防止出错,提高可移植性,可读性,方便性等等.下面列举一些成熟软件中常用的宏定义. 1 ...

  2. C语言中宏定义使用方法详解

    C语言中的宏替换详解 首先看一个问题: #include <stdio.h> #define    PRINT_CLINE()    printf("%d", ____ ...

  3. VS工程中常用路径宏定义表示

    VS IDE中常用路径 表示 $(SolutionDir) 即解决方案配置文件 xxx.sln所在的目录例如 D:\WorkSpace\CPPWorkSpace\TestDLL\ $(ProjectD ...

  4. ios 常用的宏定义

    #pragma mark - shortcuts #ifdef QA # define NSLog(fmt, ...) NSLog((@"[文件名:%s]\n" "[函数 ...

  5. php 如何宏定义,php – 在html中实现宏定义的方法

    也许显而易见,但C预处理器可以完成这项工作. index._html #define _em(a) a #define _image(a, b) #define _list(a, b, c) a \ ...

  6. iOS日常工作之常用宏定义大全

    前言: 在工作中, 很多小伙伴都会在PCH文件定义一些常用的宏,但是又怕写这些简单的宏浪费时间,又有时候忘记怎么定义了怎么办?本人在工作中也是如此.所以在这里给大家分享一些常用的宏定义,喜欢的小伙伴可 ...

  7. iOS常用宏定义大全

    宏定义与常量的区别 宏:只是在预处理器里进行文本替换,不做任何类型检查,宏能定义代码,const不能,多个宏编译时间相对较长,影响开发效率,调试过慢,const只会编译一次,缩短编译时间. 所以在使用 ...

  8. C/C++常用宏定义,注意事项,宏中#和##的用法

    总结下宏和函数的不同之处,以供大家写代码时使用,这段总结摘自<C和指针>一书. 当然宏定义非常重要的,它可以帮助我们防止出错,提高代码的可移植性和可读性等. 下面列举一些成熟软件中常用得宏 ...

  9. C语言之一些值得被定义为常用C语言头文件库的漂亮宏定义

    原文连接:https://mp.weixin.qq.com/s/OICAfQgMKWfBLuZbp2gCBw 写好C语言,漂亮的宏定义很重要,使用宏定义可以防止出错,提高可移植性,可读性,方便性等等. ...

最新文章

  1. linux下创建多进程,linux之多进程fork:进程创建
  2. 网络爬虫-爬取微博热门话题前15个
  3. opencv实现快速傅立叶变换和逆变换
  4. SpringBoot 使用Swagger2打造在线接口文档(附源代码)
  5. html如何获得网址,已知一个网址,如何获得该网址对应的html源代码?在del 找人事管理软件...
  6. mysql模糊查询与预编译_mysql预编译模糊查询恶心了我一天的时间,终于弄好了。但是还有一点不明白。如下:...
  7. 初级程序员为避免淘汰该怎么办?
  8. Android TextView 带背景的文字垂直方向显示(ems属性)
  9. PG13用pg_rman进行备份恢复
  10. Java实现Excel导入和导出,看这一篇就够了(珍藏版)
  11. 令牌环网 IEEE802.5
  12. 社会化媒体驱动营销转型
  13. OCT图像层次分割相关论文泛读
  14. 如何保证测试质量之Bug管理规范及流程
  15. 强化学习——多智能体强化学习
  16. mysql 自己的ip怎么查看_如何查看连接mysql的ip地址
  17. 什么是云服务和云服务端开发?
  18. java excel相同的合并_Java使用Apache POI合并Excel连续相同内容的单元格
  19. CTFHUB-WEB-文件上传【06】
  20. 带你了解什么是Nginx(实操反向代理-负载均衡)

热门文章

  1. 微信之父张小龙谈移动互联网产品:我所说的都是错的!
  2. MySQL(三)-数据类型
  3. 一款综合(QQ 音乐、微信、美团、优酷、虎牙直播等多款 app)风格的搜索控制器...
  4. 2013.10.30 当着众人面批评一位员工
  5. sql学习---datepart函数的使用
  6. 推荐算法之隐语义模型(LFM)矩阵分解梯度下降算法实现
  7. 益阳安化云台山风景区,周末去亲子游——湘中第一条玻璃栈道
  8. 鸿蒙系统2.0升级机型,鸿蒙系统2.0升级将覆盖华为的大面积的主流机型
  9. 降压恒流工作灯方案 4线6珠 AP5218车灯恒流芯片
  10. Java进阶学习第二十六天(JavaScript增强、AJAX基础)