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