iOS开发·适配iPhone X相关的宏和方法

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

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

 

1283539-1f9e771f3c5134b1.png

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

1.1 判断:宏

(1)依据屏幕分辨率

三目运算法

 

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

多行逻辑判断

 

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

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

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

(2)依据屏幕尺寸

 

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

1.2 判断:方法

方法:依据设备型号

 

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

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. + (NSString *)getSystemVersion{ 
  2.     return [[UIDevice currentDevice] systemVersion]; 

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

 

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

4. 适配iPhone X的其他问题

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

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

 

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

还可以这样设置

 

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

关于根视图的安全区

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

 

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

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

责任编辑:未丽燕 来源: 陈满iOS
相关推荐

2013-07-23 07:34:54

iOS开发学习适配iphone5

2017-03-20 15:58:20

iOS开发常用宏

2017-11-13 16:35:36

iPhone X全面屏APP

2018-07-26 15:16:50

小程序iPhone X甜酸

2017-12-01 09:57:21

谷歌iPhone X苹果

2011-07-25 15:46:10

iPhone 动态

2011-07-08 14:58:16

iPhone Xcode iOS

2015-07-20 10:54:47

IOS提高效率工具

2011-08-22 14:12:48

iPhone开发NSTableView

2011-08-02 13:35:41

iOS开发 Get Post

2011-08-19 13:34:33

iPhone应用ABAddressBo

2021-09-07 10:17:35

iOS多语言适配设计

2011-03-16 11:22:16

iconDefaultiPhone

2018-01-05 12:02:46

iPhoneiPhone X苹果

2018-01-02 16:08:00

AndroidiOSReact Nativ

2015-02-05 14:31:45

iPhone适配

2014-02-19 09:59:52

iOS开发Html解析

2019-02-25 06:46:59

iOS 工具 操作系统

2012-09-19 09:54:52

iOS开发者iPhone 5

2011-05-16 17:19:29

游戏开发iPhone
点赞
收藏

51CTO技术栈公众号