完美解决iPhoneX, iphoneX Max自定义tabBar造成的重影问题

在iOS开发中,底部的tabBar通常都是需要自定义,因为系统自带的或多或少和我们要求的总有一点的出入。
在自定义tabBar后,通常做法就是移除系统的tabBar来防止出现重影的问题。
在iPhoneX之前我们通常都是在导航中使用这样的方法来移除系统的tabBar的。
方法一:在自定义的UINavigationController中的下面方法中这样写:


图1.png
- (void)navigationController:(UINavigationController*)navigationController willShowViewController:(UIViewController*)viewController animated:(BOOL)animated{   
 // 删除系统自带的tabBarButton   
 for (UIView *tabBar in self.tabBarController.tabBar.subviews) {       
         if ([tabBar isKindOfClass:NSClassFromString(@"UITabBarButton")]) {           
                [tabBarremoveFromSuperview];       
         }
     }
 }

方法二:或者在自定义的TabBarController中的下面方法中这样写:

图2.png

视图即将出现时进行删除。
效果自然能够实现。因为这是在iphoneX,iphoneX Max之前最常用的消除系统系统tabBar的方法。
但是!在iphoneX,iphoneX Max之后,我们在适配的时候,如果还是只加上这些代码的话,在进入初始界面的时候,并没有发现什么问题(正常)。如图3:

图3
- (void)viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];
    for (UIView *tabBar in self.tabBarController.tabBar.subviews) {
        if([tabBar isKindOfClass:NSClassFromString(@"UITabBarButton")]){
            [tabBar removeFromSuperview];
        }
    }
}

但当进入二级页面再返回后就会发现变成如下图4所示样式了:

图4

解决方法:

在自定义的TabBarController中。添加删除系统tabBar的代码。具体如下 图5:


图5
// 解决iphoneX在返回时候tabb出现重影的问题
- (void)viewWillLayoutSubviews{   
    [super viewWillLayoutSubviews];   
    for (UIView *view in self.tabBar.subviews) {       
        if(![viewisKindOfClass:[MainTabBarclass]]) {           
            [viewremoveFromSuperview];       
        }   
    }
}

这样就完美解决了iphoneX,iphoneX Max上,在返回时候tabb出现重影的问题。
大概原理:在iphoneX,iphoneX Max中,系统的控件(似乎是)只能隐藏,不能删除,再返回的时候,系统会自动判断,添加已删除的系统控件。(具体的真实性有待研究)。
这两者的代码区别是,前者我们只删除一次,后者是在前者基础上再删除一次,以防出现的时候不能删除,在viewWillAppear中删除只是保证删除一次。所以要进行多次删除。
这样多次删除会不会把本来不存在的删除会出现空指针访问错误?
不会的。因为我们是遍历他的子控件时是发现有才去删除,所以并不会删除不存在的东西。
到此,iPhoneX自定义tabBar造成的重影问题完美解决。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容