美文网首页iOS知识收录经验demoiOS Developer
iOS 修改UITabBar的默认点击行为

iOS 修改UITabBar的默认点击行为

作者: 要上班的斌哥 | 来源:发表于2015-12-23 20:45 被阅读4993次
项目截图

当我接到如上图这个需求的时候,评估了一下。感觉如上图的效果用自定义UITabBar的方式就可以实现了(做法类似新浪微博的自定义UITabBar中的不规则按钮),没错,就是干。一番折腾之后,我实现了自己的自定义UITabBar,然后一经测试,问题出来了。

当navigationController拥有超过2个ViewController的时候,我使用self.navigationController popToViewController: animated:方法的时候会出现系统自带的UITabBar的按钮和我自定义UITabBar的按钮重叠的问题。

这下坑爹了吧,我明明在自定义UITabbar按钮的时候把系统自带的UITabbar里面的控件删掉了啊!那要不将就着用吧,不要使用popToViewController操作就好了吧,这个是坑爹和坑队友了,让团队里的其它人都不能使用self.navigationController popToViewController: animated:方法了。

这个时候就要换个思路来了,我一定要自定义UITabBar么? 有没有办法点击按钮的时候不要去跳到某个ViewController,而是执行自定义的事件。并且本来UITabBar里面的按钮的图片也是可以调位置的,这样是不是就完美解决这个需求了呢?程序员就是一类不断遇到问题并解决问题的人呐。

找到了UITabBarController的代理UITabBarControllerDelegate,看了看里面的方法,有发现了。点击了UITabBar的按钮之后,UITabBarController会执行UITabBarControllerDelegate的以下方法,并将要跳转到的UIViewController作为参数传递给一下代理方法。如果代理方法返回YES那么UITabBarController就会正常跳转,如果返回NO,那么就不会做跳转动作。方法如下:

- (BOOL)tabBarController:(UITabBarController*)tabBarController shouldSelectViewController:(UIViewController*)viewController

理清思路了,接下来就上代码了。

1、为了方便,基本上所有的代码都是写在AppDelegate

2、分别创建了A,B,C,D这四个ViewController,每个ViewController有一个用于区别彼此的文本。

3、为每个ViewController创建对应的UITabBarItem。

4、创建四个对应ViewController的对象。

5、将ViewController的对象放到数组容器里面。

6、设置UITabBarController的viewControllers属性,设置UITabBarController的代理,设置UITabBarController为window的RootViewController。

再来一个图

7、实现UITabBarController的队友代理方法,判断是否是要跳转到D ViewController,如果是的话,那么就不要跳转了,如果不是那么不做处理。

8、做出一个弹窗提示,做Demo我就比较随意点喽,还是直接用UIAlertView来提示。

9、如左边模拟器运行图所示,点击第四个按钮,会有弹窗出现,Xcode底部输出对应的LOG。

10、这个弹窗只是做一个抛砖引玉的效果,在捕捉到UITabBar的按钮点击事件之后,你就可以实现你的业务逻辑了,而且不用担心和系统UITabBar的兼容问题(因为你本来就没有做改变),也不用担心队友的各种popToViewController操作,是不是很爽?哈哈。

附上案例 http://pan.baidu.com/s/1bnUPYmr 

如果你觉得我的这篇文章对你有一丁点儿作用的话,那么希望你能在下方给个赞哈,让我知道这文章已经起了它应该的作用,谢谢!

相关文章

网友评论

  • JerryT_T:- (BOOL)tabBarController:(UITabBarController*)tabBarController shouldSelectViewController:(UIViewController*)viewController 这个方法没有执行怎么回事~我已经遵循代理了
  • 独孤流:你的这个思路确实简单高效,我之前的一个APP也是这样在代理做了个判断,当时还遇到个问题,有些业务有快捷入口,不点击tabBar要做到和点击tabbar一样的功能,而是使用代码self.tabbarController.selectIndex = 3这种方式就不会走代理回调方法了,我当时脑洞打开,使用runtime写了个分类解决了这个问题,有兴趣可以看看http://www.jianshu.com/p/494f0f4433d5
  • feng_dev:求解答
  • feng_dev:大神,我遇到个问题,就是想点击一个tabbar item 后 选中状态下 还能再次选中, 第一次选中显示 一个表,第二次 弹出一个拨号盘,怎么做,我在UITabbarController Delegate 里面的 代理方法 实现了 换 item 图片 。可是不行,不知道为什么
  • feng_dev:大神写的很好
  • iOS程序犭袁:你文章里提到的我项目的issue,我关闭了,因为不会出现issue的问题。也欢迎你再测试测试,确认下是否真的如此。如果测试没问题的话,帮忙在文章里声明下不会出现你提到的问题,谢谢了!
    要上班的斌哥:@iOS程序犭袁 :smile: 先前太忙了,没有看到评论,我再次测试之后没有发现这个问题了。
  • puppySweet:谁做过视频裁剪。我现在拍的时候分辨率是1280x720,16:9 。然后用边长为屏幕宽的正方形的拍摄画面给用户 ,拍完裁剪才成720x720 。这样裁剪出来的分辨率也是720x720 ,并且裁剪出来的画面和用户拍时候的画面一样是吧。
    Qson1:请问你做过超过10s的视频截成10s秒吗
  • iOS程序犭袁:我是 CYLTabBarController 的作者,我对你提到的问题很感兴趣,包括你提到的 issue,但是我无法复现该问题,请问,针对我的CYLTabBarController具体复现步骤,你也帮忙看下,是否能复现该问题吧!
    iOS程序犭袁:@puppySweet 你文章里提到的我项目的issue,我关闭了,因为不会出现issue的问题。也欢迎你再测试测试,确认下是否真的如此。如果测试没问题的话,帮忙在文章里声明下不会出现你提到的问题,谢谢了!
    iOS程序犭袁:@puppySweet 不一样,我的框架使用这个方法不会引起异常。self.navigationController popToViewController: animated:。如果你这里有使用异常的话,欢迎反馈给我。我修改下。
    puppySweet:@iOS程序犭袁 你那个不是合mj的一样么
  • niuxinghua:按照这个思路新浪微博的tab没必要自定义了嘛 :smiley:

本文标题:iOS 修改UITabBar的默认点击行为

本文链接:https://www.haomeiwen.com/subject/kqsvhttx.html