之前曾整理过两篇自定义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;
}
网友评论