RDVTabBarController iPhoneX適配
最近在做新專案然後嘗試用 Vue 開發,學新技術學得不亦樂乎。但iPhone X馬上可以預購了,數了數手頭上的專案,有四個原生的App 需要適配,真的不能再拖了,終於鼓起勇氣收拾這個攤子。
適配過程中發現用的RDVTabBarController第三方庫是個大問題。
忽略商品內容吧,但必須解釋一下,我們不是一家專門賣衛生巾的公司!!!懶得給頁面打碼了……
由於四個專案都對RDVTabBarController依賴較深且沒有使用cocoapods,而是手動拖拽,裡面的檔案根據專案需要已經改了一部分,並且忘記改了哪裡,所以不考慮換第三方或者重寫,直接對RDV進行改動從而適配
確認目標
iPhone X,tabbar高度49pt變成了83pt
我們的目標是什麼?
我們的目標是:把tabBar 整體向上移動 34pt!!!
所以初步想法是找到tabBar的父檢視,使其父檢視高度變成83pt,但是tabBar的高度保持49pt,y=0,這樣,底部就留出了34pt的安全距離(後期實現大體相同,細節不同)
分析檔案實現
RDV的庫目錄結構簡單
看一下.m檔案
設定顏色:
綠色 tabBarController.view
黃色 tabBarController.view上的contentView
紫色 tabBar的顏色
藍色 tabBar上面的backgroundView的顏色
執行後,使用Xcode檢視層級,效果如下
可以看到藍色view下面有一個相同frame的白色view,這個應該是tabBar,但是紫色沒有顯示出來,沒有細究,可能是顏色設定方法的問題
通過上面的層級圖,可以看出,tabBarController上的contentView(黃色)的高度加上tabBar(白色)的高度是整個螢幕的高度,所以,我們需要讓contentView(黃色)底部留出83pt,tabBar(白色)的高度變成83pt,然後tabBar上面的backgroundView(藍色)高度保持49pt,並保持和tabBar的頂部對齊。
具體實現
RDVTabBarController
找到設定contentView的frame的方法
修改前
修改後
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的地方
修改前
此時, 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設定
完成
不要吐槽底部空蕩蕩太醜,說不定人家真機上美美的呢……相信美好的事情總會發生。