说明: 目前调整的项目是基于纯代码构建.
整体调整
由于项目是基于 UITabBarController + UINavigationController 搭建的, 所以整体的 UI 适配包括两部分. 首先, 基于 UITabBarController 的几个主页面的高度是实际的屏幕高度, 其次, 其它子页面的高度为: 实际屏幕的高度 - 34 . 这样子页面底部就留出了 34 的安全距离.
一、UITabBarController 高度
// _SCREEN_HEIGHT 为实际屏幕高度
tabBarCtrl.view.frame = CGRectMake(0, 0, GET_CUR_DEVICE_WIDTH, _SCREEN_HEIGHT);
二、宏定义
iPhoneX 的适配主要是高度的适配, StatusBar 相关调整 . 主要是在 GlobalMacro.h 中定义以下宏来兼容处理.
#define iPhoneX_HEIGHT 812
#define iPhoneX (_SCREEN_HEIGHT == iPhoneX_HEIGHT)
#define UISCREEN_HEIGHT (iPhoneX ? ([[UIScreen mainScreen] bounds].size.height-34) : ([[UIScreen mainScreen] bounds].size.height))
#define _STATUS_BAR_HEIGHT (iPhoneX ? 44 : 20)
#define iPhoneXSafeDelta (iPhoneX ? 34 : 0) // 用于其它特殊页面调整
-
高度的适配
原理: 通过宏 iPhoneX 判定是否是 iPhoneX 设备, 然后作相应处理.- iPhoneX: UISCREEN_HEIGHT = 实际屏幕的高度 - 34
- 其它: UISCREEN_HEIGHT = 实际屏幕的高度
StatusBar
StatusBar 主要是高度的调整, iPhoneX 为 44 , 其它设备 20.TabBar 线条处理
首页 tabBarCtrl 的 tabBar 默认高度为 83 , 原来 tabBar 的背景图高度只有 49, 所以会出现一条线条.
解决: 将 TabBar 的背景图片拉伸
UIImage *imamge = [UIImage imageFileNamed:@"tabNewBar"];
[tabBarCtrl.tabBar setBackgroundImage:[imamge stretchableImageWithLeftCapWidth:20 topCapHeight:20]];
三、适配后的页面
启动图, 引导图替换
原有尺寸不能满足要求, 需提供尺寸为 1125px × 2436px 的图片. 否则启动出现上下有黑条的情况.
启动图片代码更改
iPhone X 对应的启动图名称为"LaunchImage-1100-Portrait-2436h@3x.png".
if (iPhoneX) launchImageName = @"LaunchImage-1100-Portrait-2436h@3x.png";
根据状态栏获取网络状态
iPhone X 的状态栏发生了很大变化, 原来通过方法 getNetWorkStates 获取网络状态已经失效. 也曾试图通过 runtime 去获取, 但最终以失败告终. 目前的处理方式是做兼容处理, iPhone X 使用三方框架 RealReachability , 其它设备还是沿用以前的方式.
+(NSString *)getNetWorkStates
{
UIApplication *app = [UIApplication sharedApplication];
NSArray *children = [[[app valueForKeyPath:@"statusBar"]valueForKeyPath:@"foregroundView"]subviews];
NSString *state = @"-1";
int netType = 0;
//获取到网络返回码
for (id child in children) {
if ([child isKindOfClass:NSClassFromString(@"UIStatusBarDataNetworkItemView")]) {
//获取到状态栏
netType = [[child valueForKeyPath:@"dataNetworkType"]intValue];
switch (netType) {
case 0:
//无网模式
state = @"-1";
[NSGlobe getEngine].netStatus = NotReachable;
break;
case 1:
state = @"2G";
[NSGlobe getEngine].netStatus = ReachableVia2G;
break;
case 2:
state = @"3G";
[NSGlobe getEngine].netStatus = ReachableVia3G;
break;
case 3:
state = @"4G";
[NSGlobe getEngine].netStatus = ReachableVia4G;
break;
case 4:
state = @"LTE";
[NSGlobe getEngine].netStatus = ReachableViaLTE;
break;
case 5:
state = @"WIFI";
[NSGlobe getEngine].netStatus = ReachableViaWiFi;
break;
default:
break;
}
break;
}
}
return state;
}
字体变大
使用 UITableViewCell 时没有设置 font
iPhone X Push过程中TabBar位置上移
在UINavigationController的基类重写pushViewController代理方法,在Push的时候修正一下TabBar的frame
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
{
if (self.viewControllers.count > 0) {
viewController.hidesBottomBarWhenPushed = YES;
}
[super pushViewController:viewController animated:animated];
// 修改tabBra的frame
CGRect frame = self.tabBarController.tabBar.frame;
frame.origin.y = [UIScreen mainScreen].bounds.size.height - frame.size.height;
self.tabBarController.tabBar.frame = frame;
}
使用新编译器时无法识别自定义宏
Xcode 9 ,使用 new build system 时 pch 文件无法识别其中导入的头文件, 暂时未找到解决办法.