适配iPhone X Push过程中TabBar位置上移

作者: 臭码农 | 来源:发表于2017-09-29 15:36 被阅读3397次

    前言

    就在刚刚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:臭码农

    相关文章

      网友评论

      • 米芷萍:看不懂。但好崇拜你们这些做程序的人👍👍👍👍
        米芷萍:@臭码农 👍👍👍
        臭码农:@庶人米 术业有专攻,我更崇拜有文采的人,三言两语写出一幅画面
      • A_rcher34:棒棒的!
      • 风茗夜雨:GitHub下载 解压失败 什么鬼?
        臭码农:@怡红公子潇湘馆 太大,下载失败了,重新下载吧
      • footSInRoad:棒棒的。。。
      • 矫炎圻:那这么做是不是还是么有从源头解决问题,只是在它迅速上移之后你又给它拉了回来。:sweat:
        臭码农:@矫炎圻 我会继续跟进,一定会从源头解决
      • bf9bb0cce5eb:在iPhone X模拟器中,present弹出页面跳转("Demo" - "11-JS与Native交互")再返回之后,再push跳转("Demo" - "12-轮播)时tabbar整个高度变成了49,整体又向下移动了。@臭码农
        臭码农:@曾经沧海丶 能把你的代码贴出来吗?
        bf9bb0cce5eb:@臭码农 已经解决了 需要重写tabBar的方法
        臭码农:@曾经沧海丶 最近在加班搞业务,我会抽时间解决一下
      • 小锤子_:我以为故意这样的
      • 5062dcbf1409:请教右下角显示 fps 的是什么?
        5062dcbf1409:@臭码农 额我的意思是,有什么办法在模拟器上开启这个功能吗?
        臭码农:@点山 就是当前的帧数啊:sweat:
      • Ultraman_Nexus:XYTransitionProtocol和isNeedTransition需要调整成什么,能详细一点说明吗?把if里的这一段去掉的话,Tabbar还是会往上跑一段距离
        Ultraman_Nexus:@臭码农 if语句里的XYTransitionProtocol和isNeedTransition是怎么定义的啊,,,,,,,现在Tabbar不会移动了,但是hidesBottomBarWhenPushed.hidden这个还是要写好多次,发布发一份完整的代码给我吗?
        Ultraman_Nexus:@臭码农 加了
        臭码农:@Ultraman_Leo 不清楚你说的是哪一段,加我qq聊 49900037
      • 薛定谔的熊:这个问题在iPhone X上确实是存在的,我深有体会,不过当时没有找到解决方案,感谢楼主。
      • winnerred:为什么这种项目也有500星
        爃少:某宝,你想要多少都有
        鱼遇雨欲語:you can you...
        臭码农:@winnerred 这个问题值得深思
      • 大刀阔斧007:厉害了
      • 高丘上:世界是属于青年的!看不懂呀!
        CoderBigBear:@高丘上 活到老学到老才是
        高丘上: @高丘上 这些新科技、新技术,老年人是学不会了。所以,世界是属于青年的。
        臭码农:@高丘上 术业有专攻,文笔方面还需要向您学习

      本文标题:适配iPhone X Push过程中TabBar位置上移

      本文链接:https://www.haomeiwen.com/subject/bbuiextx.html