自定义View 覆盖到Tabbar上, View不响应事件问题
本来想等把所有项目代码都敲个十遍八遍的,再上来写点稍微技术点的东西,但是昨天遇到一个问题, 今天晚上终于解决了.总算能写篇技术文章了.
========
当我们使用TabBarController的时候, 系统自带的TabBar用着不顺手, 我们都会用各种方法自定义一个.
1,有的直接将TabBar隐藏,然后用一个View去覆盖它,在View上添加button. 这种方法缺点就是不能在别的控制器里面 想获取 TabBar一样去随心所欲的获取到它, 比如,在跳转到子控制器的时候, 我们往往需要隐藏底部的"TabBar", 这时候, 需要考虑隐藏你这个所谓的"TabBar"------------自定义的View, 但是这时候, 不好获取.很麻烦.解决方案
2,直接真正的自定义TabBar, 这种方法我还没有研究.
3, 第一种方法的改进版.在storyboard里面把控制器都处理好, 然后再自定义TabBarController, 并自定义一个View去覆盖TabBar. 在TabbarController的loadView方法里面创建自定义的View, 然后添加到TabBar里面.
- (void)loadView{
[super loadView];
AMTarbar *mTabbar = [[AMTarbar alloc] initWithFram: self.tabBar.bounds];
[self.tabBar addSubview:mTabbar];
}
这种方法解决了第一种方法无法轻松的获取到自定义的View问题, 因为我们直接将View添加到了TabBar里面, 成为了TabBar的子控件,所以就很方便操作了.
但是这种方法只适用于从storyboard里面加载控件时候才行, 不然会出现View上的button按钮无法响应事件..
4, 解决第三种方法,不能在纯代码下实现View响应的问题...
这个问题我百度了一堆, 也没搞明白, 我捋了下事件响应的机制,TabBar本身生成的按钮能响应 但是我确确实实点击的是View上面的按钮..所以我怀疑是这个View压根没添加进去(代码模式下). 因为tabbarcontroller的生成上就有特殊性, 他不是线性顺序生成的. 因为他需要根据其他控制器 去生成tabbar上面的按钮.
我打印了下tabbar.subviews, 果然里面根本没有我们自己添加的View, 那也就是说, 当我们在代码模式下, 它的代码执行并不是我们相像的那么简单..知道了问题所在,也就解决了,我们不管他中间干了啥, 我在最后面时候,把View添加到tabbar上就行了.
解决方案
- (void)viewWillAppear:(BOOL)animated{
AMTarbar *mTabbar = [[AMTarbar alloc] initWithFram: self.tabBar.bounds];
[self.tabBar addSubview:mTabbar];
}
把LoadView里面的代码拿出来, 放到这个方法里面, 就是在View将要显示的时候, 我再去添加View..测试成功!