前言
就在刚刚GitHub
有同学给我提了个Issue
,说我的框架在iPhone X
上跑有bug,Push
新页面的时候TabBar
会上移。开玩笑吧?我的框架怎么会有bug,这一定是个误会,于是我去iPhone X跑了一下,哎哟嘿,脸好疼
发现问题
来个慢动作:
iPhone X 不完美.gif上图可发现,点击跳转的时候,
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;
}
其他跳动问题解决
在继承于系统UITabBar
的子类加上下面代码
#import "XYTabBar.h"
@interface XYTabBar()
@property (nonatomic,assign)UIEdgeInsets oldSafeAreaInsets;
@end
@implementation XYTabBar
- (void) safeAreaInsetsDidChange
{
[super safeAreaInsetsDidChange];
if(self.oldSafeAreaInsets.left != self.safeAreaInsets.left ||
self.oldSafeAreaInsets.right != self.safeAreaInsets.right ||
self.oldSafeAreaInsets.top != self.safeAreaInsets.top ||
self.oldSafeAreaInsets.bottom != self.safeAreaInsets.bottom)
{
self.oldSafeAreaInsets = self.safeAreaInsets;
[self invalidateIntrinsicContentSize];
[self.superview setNeedsLayout];
[self.superview layoutSubviews];
}
}
- (CGSize) sizeThatFits:(CGSize) size
{
CGSize s = [super sizeThatFits:size];
if(@available(iOS 11.0, *))
{
CGFloat bottomInset = self.safeAreaInsets.bottom;
if( bottomInset > 0 && s.height < 50) {
s.height += bottomInset;
}
}
return s;
}
@end
注意:
如果你的TabBar是非继承自UITabbar的,而是自定义UIView 然后 addSubView到系统的TabBar里的,那上面方法可能无效,之前我的框架就是个UIView,奇葩问题太多,建议要么继承于系统的,要么完全自己实现底部整个TabBar。目前系统提供的UITabbar也不错的,通过重写来支持自定义样式,可以满足大部分APP的需求。
修正完的效果:
iPhone X 完美.gifiOS 超级码农交流群:538549344 技术大牛在等你来提问
以上属于臭码农原创,若有雷同属巧合,如有错误望指正,转载请标明来源和作者。by:臭码农
网友评论