IOS-自定義View 覆蓋到Tabbar上, View不響應事件問題
自定義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..測試成功!