iPhoneX 相关适配

说明: 目前调整的项目是基于纯代码构建.

整体调整

由于项目是基于 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) // 用于其它特殊页面调整
  1. 高度的适配
    原理: 通过宏 iPhoneX 判定是否是 iPhoneX 设备, 然后作相应处理.

    • iPhoneX: UISCREEN_HEIGHT = 实际屏幕的高度 - 34
    • 其它: UISCREEN_HEIGHT = 实际屏幕的高度
  2. StatusBar
    StatusBar 主要是高度的调整, iPhoneX 为 44 , 其它设备 20.

  3. TabBar 线条处理
    首页 tabBarCtrl 的 tabBar 默认高度为 83 , 原来 tabBar 的背景图高度只有 49, 所以会出现一条线条.

iPhoneX 相关适配_第1张图片
线条

解决: 将 TabBar 的背景图片拉伸

UIImage *imamge = [UIImage imageFileNamed:@"tabNewBar"];
[tabBarCtrl.tabBar setBackgroundImage:[imamge stretchableImageWithLeftCapWidth:20 topCapHeight:20]];
三、适配后的页面
iPhoneX 相关适配_第2张图片
首页
iPhoneX 相关适配_第3张图片
子页面

启动图, 引导图替换

原有尺寸不能满足要求, 需提供尺寸为 1125px × 2436px 的图片. 否则启动出现上下有黑条的情况.


iPhoneX 相关适配_第4张图片
启动图

启动图片代码更改

iPhone X 对应的启动图名称为"[email protected]".

if (iPhoneX) launchImageName = @"[email protected]";

根据状态栏获取网络状态

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 文件无法识别其中导入的头文件, 暂时未找到解决办法.

你可能感兴趣的:(iPhoneX 相关适配)