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, 所以会出现一条线条.

线条

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 相信大家已经被iPhoneX的刘海洗脑了,除了吐槽,留给我们的还有比较麻烦的适配工作。下面针对在整理过程中发现的适...
    smile丽语阅读 10,331评论 6 21
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 176,200评论 25 709
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,088评论 19 139
  • Swift版本点击这里欢迎加入QQ群交流: 594119878最新更新日期:18-09-17 About A cu...
    ylgwhyh阅读 25,714评论 7 249
  • 最近几天总是在半夜醒来,脑子里总是有一个很久很久之前的名字盘旋着。打开灯,泡杯热茶捧在掌心,坐在窗边望着楼下的大...
    旧梦烟雨生阅读 2,833评论 0 0

友情链接更多精彩内容