自定义TabBar03

之前曾整理过两篇自定义TabBar的文章:
自定义TabBar01
自定义TabBar02

这里先将以前的两种实现方式思路剪短的描述一下,接下来再补充另外一种简便的方式,并强调一下注意点:

  • 自定义TabBar01中,完全采用了自定义控件的方式覆盖到原有TabBarController的,通过代理的方式监听每一个自定义按钮的点击,获取到一个Tag值,在TabBarController中通过其selectedIndex属性来手动切换控制器选中
  • 自定义TabBar02中,使用UITabBarController时,都需要设置其子控制器,在原有TabBar基础上只是增加了一个自定义Button,并在LayoutSubView方法中,遍历subViews重新设置Frame,最后通过代理监听自定义按钮的点击
接下来介绍一种更为简单的方式:

1.在给TabBarController添加子控制器时,在需要的位置上加入一个占位的UIViewController控制器
2.在占位控制器所在位置的TarBar处,加上一个自定义Button,可以手动设置其Frame,也可以通过CGRectInset(<#CGRect rect#>, <#CGFloat dx#>, <#CGFloat dy#>)方法设置其X坐标的缩放距离

e.g.   自定义button.frame = CGRectInset(self.tabBar.bounds, i*ItemWidth, 0)

3.通过前两步基本已经实现自定义TabBar的效果,但是有一个细节需要考虑,每个TabBarItem间都会有大概一个点距离的容错点,当使用手指时可能不太容易触及,但在使用模拟器时,比较容易复现出这个Bug,在自定义Button两侧点着点着,就容易把占位控制器的界面点出来,所以当我们使用上面缩放的方式来设置buttonframe时,可以让其少缩放一些,来遮挡住两侧的容错点(就相当于让自定义Button的宽度稍微变大一点点)

e.g.   自定义button.frame = CGRectInset(self.tabBar.bounds, i*(ItemWidth-1), 0)

区别:
1.自定义TabBar01自定义程度最高,代码实现相对复杂一点
2.自定义TabBar02自定义程序适中,代码量比前一种明显减少
3.自定义TabBar03自定义程序最低,只是加了一个Button,而且免去了代理/block等回调,直接addTarget即可,代码量最少,但是需要注意第3点的细节

通过更改自定义Button.frame的方式解决穿帮的问题不是十分严谨,有些取巧
我们还可以通过UITabBarControllerDelegate中的代理方法来妥善解决这个Bug
说明:

首先通常情况下,我们使用TabBarController的时候,根控制器一般都是使用UINavigationController,我们可以借助控制器类型进行判断,在将要点击TabBar的时候,是否进一步选中对应的控制器,示例代码:

#pragma mark
#pragma mark - UITabBarControllerDelegate

- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController NS_AVAILABLE_IOS(3_0) {
    
    if ([viewController isKindOfClass:[XXXController class]] ) {
        
        return NO;
    }
    
    return YES;
}

你可能感兴趣的:(自定义TabBar03)