前言
就在剛剛GitHub
有同學給我提了個Issue
,說我的框架在iPhone X
上跑有bug,Push
新頁面的時候TabBar
會上移。開玩笑吧?我的框架怎麼會有bug,這一定是個誤會,於是我去iPhone X跑了一下,哎喲嘿,臉好疼
發現問題
來個慢動作:
上圖可發現,點選跳轉的時候,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的需求。
修正完的效果:
iOS 超級碼農交流群:538549344 技術大牛在等你來提問 以上屬於臭碼農原創,若有雷同屬巧合,如有錯誤望指正,轉載請標明來源和作者。by:臭碼農