本文主要是介绍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 XBOOL 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 itemsfor (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设置
完成
不要吐槽底部空荡荡太丑,说不定人家真机上美美的呢……相信美好的事情总会发生。
注意:最好不要将上面的代码直接粘贴到你的项目中,前文提过,我改过文件并且忘记改了哪里,所以谨慎粘贴。思路已提供,可以试着自己改改。
这篇关于RDVTabBarController iPhoneX适配的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!