1. 程式人生 > >RDVTabBarController iPhoneX適配

RDVTabBarController iPhoneX適配

最近在做新專案然後嘗試用 Vue 開發,學新技術學得不亦樂乎。但iPhone X馬上可以預購了,數了數手頭上的專案,有四個原生的App 需要適配,真的不能再拖了,終於鼓起勇氣收拾這個攤子。

適配過程中發現用的RDVTabBarController第三方庫是個大問題。
iPhone X模擬器-適配前.png

忽略商品內容吧,但必須解釋一下,我們不是一家專門賣衛生巾的公司!!!懶得給頁面打碼了……

由於四個專案都對RDVTabBarController依賴較深且沒有使用cocoapods,而是手動拖拽,裡面的檔案根據專案需要已經改了一部分,並且忘記改了哪裡,所以不考慮換第三方或者重寫,直接對RDV進行改動從而適配

確認目標

iPhone X,tabbar高度49pt變成了83pt

我們的目標是什麼?
我們的目標是:把tabBar 整體向上移動 34pt!!!
所以初步想法是找到tabBar的父檢視,使其父檢視高度變成83pt,但是tabBar的高度保持49pt,y=0,這樣,底部就留出了34pt的安全距離(後期實現大體相同,細節不同)

分析檔案實現

RDV的庫目錄結構簡單
RDV-檔案目錄.png

看一下.m檔案
RDVTabBarController.png

RDVTabBar.png

設定顏色:
綠色 tabBarController.view
黃色 tabBarController.view上的contentView
紫色 tabBar的顏色
藍色 tabBar上面的backgroundView的顏色

執行後,使用Xcode檢視層級,效果如下

view層級圖.png

可以看到藍色view下面有一個相同frame的白色view,這個應該是tabBar,但是紫色沒有顯示出來,沒有細究,可能是顏色設定方法的問題

通過上面的層級圖,可以看出,tabBarController上的contentView(黃色)的高度加上tabBar(白色)的高度是整個螢幕的高度,所以,我們需要讓contentView(黃色)底部留出83pt,tabBar(白色)的高度變成83pt,然後tabBar上面的backgroundView(藍色)高度保持49pt,並保持和tabBar的頂部對齊。

具體實現

RDVTabBarController

找到設定contentView的frame的方法

修改前
修改前.png

修改後

void (^block)() = ^{
    CGSize viewSize = weakSelf.view.bounds.size;
    CGFloat tabBarStartingY = viewSize.height;
    CGFloat contentViewHeight = viewSize.height;
    CGFloat tabBarHeight = CGRectGetHeight([[weakSelf tabBar] frame]);

    //判斷是否是iPhone X
    BOOL isiPhoneX = ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(1125, 2436), [[UIScreen mainScreen] currentMode].size) : NO);
    if (!tabBarHeight) {
        tabBarHeight = isiPhoneX ? 83 : 49;//iPhoneX需要留出83
    }

    if (!weakSelf.tabBarHidden) {
        tabBarStartingY = viewSize.height - tabBarHeight;
        if (![[weakSelf tabBar] isTranslucent]) {
            //給tabBar的顯示留出足夠的高
            contentViewHeight -= ([[weakSelf tabBar] minimumContentHeight] ?: tabBarHeight);
        }
        [[weakSelf tabBar] setHidden:NO];
    }

    //設定tabBar的高度
    [[weakSelf tabBar] setFrame:CGRectMake(0, tabBarStartingY, viewSize.width, tabBarHeight)];
    [[weakSelf contentView] setFrame:CGRectMake(0, 0, viewSize.width, contentViewHeight)];
   後面不變......

RDVTabBar
找到設定backgroundView frame的地方

修改前

螢幕快照 2017-10-27 15.01.40.png

此時, frameSize.height = 83pt 所以使用 frameSize.height的地方,一律改成49

修改後

[[self backgroundView] setFrame:CGRectMake(0, 0, frameSize.width, 49)];

[self setItemWidth:roundf((frameSize.width - [self contentEdgeInsets].left -
                           [self contentEdgeInsets].right) / [[self items] count])];

NSInteger index = 0;

// Layout items

for (RDVTabBarItem *item in [self items])
{
    CGFloat itemHeight = [item itemHeight];

    if (!itemHeight) {
        itemHeight = 49;
    }

    [item setFrame:CGRectMake(self.contentEdgeInsets.left + (index * self.itemWidth),
                              roundf(49 - itemHeight) - self.contentEdgeInsets.top,
                              self.itemWidth, itemHeight - self.contentEdgeInsets.bottom)];
    [item setNeedsDisplay];

    index++;
}

view的顏色
根據專案的實際需求給上面提到的四個View設定顏色,tabBar的顏色是透明的,底部安全區的顏色可以通過tabBarController.view設定

完成

iPhone X模擬器-適配後.png

不要吐槽底部空蕩蕩太醜,說不定人家真機上美美的呢……相信美好的事情總會發生。

注意:最好不要將上面的程式碼直接貼上到你的專案中,前文提過,我改過檔案並且忘記改了哪裡,所以謹慎貼上。思路已提供,可以試著自己改改。