自定义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;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,241评论 4 61
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,923评论 18 139
  • 这本书分为两个部分看的——前期因为看了之后特别压抑,遂而中断,中间回了趟老家,回来又继续看才勉强看完。 对阿富汗的...
    站直慢慢走阅读 1,091评论 2 1
  • 首先我不是因为想着挣钱而被骗,而是被朋友以画墻繪和游玩的名义骗到西安。因为西安是我一直向往的地方,所以朋友说他去西...
    圣茜儿阅读 176评论 0 0
  • 前端状态管理请三思 在这篇文章中提到了前端状态管理的一种思路,也就是使用有限状态自动机来管理前端状态。初读时我没有...
    wlszouc阅读 1,590评论 0 0