IT资讯

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

作者:admin 2021-09-06 我要评论

过了好久,今天终于有时间总结一下适配iPhone X相关的坑,总的来说有两类坑,一个是导航栏+状态栏的高度发生了变化,一个是一些没有实现实现-tableView: viewFor...

在说正事之前,我要推荐一个福利:你还在原价购买阿里云、腾讯云、华为云服务器吗?那太亏啦!来这里,新购、升级、续费都打折,能够为您省60%的钱呢!2核4G企业级云服务器低至69元/年,点击进去看看吧>>>)

过了好久,今天终于有时间总结一下适配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之内,原来的老代码也就不用改。


本文转载自网络,原文链接:http://www.cocoachina.com/ios/20180115/21864.html

版权声明:本文转载自网络,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本站转载出于传播更多优秀技术知识之目的,如有侵权请联系QQ/微信:153890879删除

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

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

  • 机器学习就业形势降至冰点?对创造价值

    机器学习就业形势降至冰点?对创造价值

  • IP地址和子网掩码的计算

    IP地址和子网掩码的计算

  • 编程语言遇上超级英雄,谁才是真的本命?

    编程语言遇上超级英雄,谁才是真的本命?

腾讯云代理商
海外云服务器