在iOS开发中,底部的tabBar通常都是需要自定义,因为系统自带的或多或少和我们要求的总有一点的出入。
在自定义tabBar后,通常做法就是移除系统的tabBar来防止出现重影的问题。
在iPhoneX之前我们通常都是在导航中使用这样的方法来移除系统的tabBar的。
方法一:在自定义的UINavigationController中的下面方法中这样写:
- (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中的下面方法中这样写:
视图即将出现时进行删除。
效果自然能够实现。因为这是在iphoneX,iphoneX Max之前最常用的消除系统系统tabBar的方法。
但是!在iphoneX,iphoneX Max之后,我们在适配的时候,如果还是只加上这些代码的话,在进入初始界面的时候,并没有发现什么问题(正常)。如图3:
- (void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
for (UIView *tabBar in self.tabBarController.tabBar.subviews) {
if([tabBar isKindOfClass:NSClassFromString(@"UITabBarButton")]){
[tabBar removeFromSuperview];
}
}
}
但当进入二级页面再返回后就会发现变成如下图4所示样式了:
解决方法:
在自定义的TabBarController中。添加删除系统tabBar的代码。具体如下 图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造成的重影问题完美解决。