iPhoneX 相關(guān)適配

說明: 目前調(diào)整的項(xiàng)目是基于純代碼構(gòu)建.

整體調(diào)整

由于項(xiàng)目是基于 UITabBarController + UINavigationController 搭建的, 所以整體的 UI 適配包括兩部分. 首先, 基于 UITabBarController 的幾個(gè)主頁面的高度是實(shí)際的屏幕高度, 其次, 其它子頁面的高度為: 實(shí)際屏幕的高度 - 34 . 這樣子頁面底部就留出了 34 的安全距離.

一、UITabBarController 高度
// _SCREEN_HEIGHT 為實(shí)際屏幕高度
tabBarCtrl.view.frame = CGRectMake(0, 0, GET_CUR_DEVICE_WIDTH, _SCREEN_HEIGHT);
二、宏定義

iPhoneX 的適配主要是高度的適配, StatusBar 相關(guān)調(diào)整 . 主要是在 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) // 用于其它特殊頁面調(diào)整
  1. 高度的適配
    原理: 通過宏 iPhoneX 判定是否是 iPhoneX 設(shè)備, 然后作相應(yīng)處理.

    • iPhoneX: UISCREEN_HEIGHT = 實(shí)際屏幕的高度 - 34
    • 其它: UISCREEN_HEIGHT = 實(shí)際屏幕的高度
  2. StatusBar
    StatusBar 主要是高度的調(diào)整, iPhoneX 為 44 , 其它設(shè)備 20.

  3. TabBar 線條處理
    首頁 tabBarCtrl 的 tabBar 默認(rèn)高度為 83 , 原來 tabBar 的背景圖高度只有 49, 所以會出現(xiàn)一條線條.

線條

解決: 將 TabBar 的背景圖片拉伸

UIImage *imamge = [UIImage imageFileNamed:@"tabNewBar"];
[tabBarCtrl.tabBar setBackgroundImage:[imamge stretchableImageWithLeftCapWidth:20 topCapHeight:20]];
三、適配后的頁面
首頁
子頁面

啟動(dòng)圖, 引導(dǎo)圖替換

原有尺寸不能滿足要求, 需提供尺寸為 1125px × 2436px 的圖片. 否則啟動(dòng)出現(xiàn)上下有黑條的情況.


啟動(dòng)圖

啟動(dòng)圖片代碼更改

iPhone X 對應(yīng)的啟動(dòng)圖名稱為"LaunchImage-1100-Portrait-2436h@3x.png".

if (iPhoneX) launchImageName = @"LaunchImage-1100-Portrait-2436h@3x.png";

根據(jù)狀態(tài)欄獲取網(wǎng)絡(luò)狀態(tài)

iPhone X 的狀態(tài)欄發(fā)生了很大變化, 原來通過方法 getNetWorkStates 獲取網(wǎng)絡(luò)狀態(tài)已經(jīng)失效. 也曾試圖通過 runtime 去獲取, 但最終以失敗告終. 目前的處理方式是做兼容處理, iPhone X 使用三方框架 RealReachability , 其它設(shè)備還是沿用以前的方式.

+(NSString *)getNetWorkStates
{
    UIApplication *app = [UIApplication sharedApplication];
    NSArray *children = [[[app valueForKeyPath:@"statusBar"]valueForKeyPath:@"foregroundView"]subviews];
    NSString *state = @"-1";
    int netType = 0;
    //獲取到網(wǎng)絡(luò)返回碼
    for (id child in children) {
        if ([child isKindOfClass:NSClassFromString(@"UIStatusBarDataNetworkItemView")]) {
            //獲取到狀態(tài)欄
            netType = [[child valueForKeyPath:@"dataNetworkType"]intValue];
            
            switch (netType) {
                case 0:
                    //無網(wǎng)模式
                    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 時(shí)沒有設(shè)置 font

iPhone X Push過程中TabBar位置上移

在UINavigationController的基類重寫pushViewController代理方法,在Push的時(shí)候修正一下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;
}

使用新編譯器時(shí)無法識別自定義宏

Xcode 9 ,使用 new build system 時(shí) pch 文件無法識別其中導(dǎo)入的頭文件, 暫時(shí)未找到解決辦法.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 相信大家已經(jīng)被iPhoneX的劉海洗腦了,除了吐槽,留給我們的還有比較麻煩的適配工作。下面針對在整理過程中發(fā)現(xiàn)的適...
    smile麗語閱讀 5,017評論 6 21
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,308評論 25 708
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,680評論 19 139
  • Swift版本點(diǎn)擊這里歡迎加入QQ群交流: 594119878最新更新日期:18-09-17 About A cu...
    ylgwhyh閱讀 26,255評論 7 249
  • 最近幾天總是在半夜醒來,腦子里總是有一個(gè)很久很久之前的名字盤旋著。打開燈,泡杯熱茶捧在掌心,坐在窗邊望著樓下的大...
    舊夢煙雨生閱讀 422評論 0 0

友情鏈接更多精彩內(nèi)容