隔了好久今天终于有时间总结一下适配iPhoneX相关的坑了,总的来说有两种坑,一种是高度导航栏+状态栏的一个是一些没有实现-tableView:viewForHeaderInSection:和-tableView:viewForFooterInSection:等代理方法的UITableView会出错。1.判断是否iPhoneX:返回YES或NO1.1判断:macro(1)根据屏幕分辨率三目算法//是否iPhoneXYES:iPhoneX屏幕NO:传统屏幕#definekIs_iPhoneX([UIScreeninstancesRespondToSelector:@selector(currentMode)]?CGSizeEqualToSize(CGSizeMake(1125,2436),[[UIScreenmainScreen]currentMode].size):NO)多行逻辑判断//是否iPhoneX1:iPhoneX屏幕0:传统屏幕#definekIs_iPhoneX_test({\inttmp=0;\if([UIScreeninstancesRespondToSelector:@selector(currentMode)]){\if(CGSizeEqualToSize(CGSizeMake(1125,2436),[[UIScreenmainScreen]currentMode].size)){\tmp=1;\}else{\tmp=0;\}\}else{\tmp=0;\}\tmp;\})其中,反斜杠\不是注释或其他无用符号,实际上是多行宏换行必须使用的符号。***tmp;\这句也是必须的,因为通过逻辑判断得到的tmp作为这个宏的返回值。(2)根据屏幕尺寸#definekIs_iPhoneX(kSCREEN_WIDTH==375.f&&kSCREEN_HEIGHT==812.f)#definekSCREEN_WIDTH([UIScreenmainScreen].bounds.size.width)#definekSCREEN_HEIGHT([UIScreenmainScreen].bounds.size.height)1.2判断:Method方法:根据设备型号+(BOOL)getIs_iPhoneX{structutsnamesystemInfo;uname(&systemInfo);NSString*platform=[NSStringstringWithCString:systemInfo.machineencoding:NSASCIIStringEncoding];if([platformisEqualToString:@"iPhone10,3"]||[platformisEqualToString:@"iPhone10,6"]){returnYES;}else{returnNO;}}2.灵活返回状态栏+导航栏的高度要求:灵活获取导航栏+状态栏的高度作为子视图的Y轴起点。宏定义#definekStatusBarAndNavigationBarHeight(kIs_iPhoneX?88.f:??64.f)调用示例//自动适配_segmentedControl.frame=CGRectMake(0,kStatusBarAndNavigationBarHeight,kSCREEN_WIDTH,55);3.扩展:获取iOS系统和App版本信息iOS系统版本号:returnstring+(NSString*)getSystemVersion{return[[UIDevicecurrentDevice]systemVersion];}获取App版本号:returnstring+(NSString*)getAppVersion{NSDictionary*infoDic=[[NSBundlemainBundle]infoDictionary];//获取App的版本号NSString*appVersion=[infoDicobjectForKey:@"CFBundleShortVersionString"];returnappVersion;}4.iPhoneX适配的其他问题在适配iPhoneX和Xcode9的过程中,除了与navigationbar,还有一个经常出现的问题,就是UITableView相关的问题。以下两种方法可以解决大部分错位问题。VC创建tableView属性时,设置self.tableView.estimatedRowHeight=0;self.tableView.estimatedSectionHeaderHeight=0;self.tableView.estimatedSectionFooterHeight=0;你也可以设置//单元格自适应高度self.tableView.rowHeight=UITableViewAutomaticDimension;//预估行高self.tableView.estimatedRowHeight=44.0f;关于根视图的安全区域,iOS增加了safeArea。在原来的旧代码中,规定子视图与根子视图关系的代码需要增加一个判断:在iOS11中,需要改变子视图与根子视图安全区域的关系。这样就不会受到iPhoneX底部虚拟家庭的任何控件的干扰。if(@available(iOS11.0,*)){make.edges.equalTo(self.view.safeAreaInsets)}else{make.edges.equalTo(self.view)}当然,一般除了tabbar不能放在虚拟home区的底部,其他viewstableViewview或者webview都可以放在虚拟home区的底部。这个时候就不用强调subview一定要放在safeArea里面了,原来的老代码不用改。
