適配iPhone X Push過程中TabBar位置上移

臭碼農發表於2017-12-14

前言

就在剛剛GitHub有同學給我提了個Issue,說我的框架在iPhone X上跑有bug,Push新頁面的時候TabBar會上移。開玩笑吧?我的框架怎麼會有bug,這一定是個誤會,於是我去iPhone X跑了一下,哎喲嘿,臉好疼

image.png

發現問題

來個慢動作:

iPhone X 不完美.gif
上圖可發現,點選跳轉的時候,TabBar的確迅速上移了一段距離,沒搞懂為啥,也許蘋果別有用心,但我在心裡還是罵了一下庫克等人。

解決問題

UINavigationController的基類重寫pushViewController代理方法,在Push的時候修正一下TabBarframe

- (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:臭碼農

相關文章