iOS開發—巧用反射機制
阿新 • • 發佈:2019-02-06
1、應用場景——自定義UITabBarController的TabBar檢視 (1)隱藏TabBar檢視 一般我們選擇自定義TabBar檢視有兩種方式。1是將tabBar檢視隱藏;2是將TabBar檢視從父檢視中移除,程式碼如下(假設,已建立UITabBarController子類): - (void)viewDidLoad { // 隱藏檢視 self.tabBar.hidden = YES; // 或者直接移除TabBar檢視 [self.tabBar removeFromSuperview]; } 當執行完以上程式碼後,tabBar檢視“消失”了,就會顯示出TabBar檢視之前所佔用的空白位置,如下圖所示(): 之後,我們會將自定義的tabBar檢視新增到這個空白位置,這個空白位置的高度是49。因此我們自定義的TabBar檢視高度也應該是49,否則會出現Gap。 然而有時,我們的自定義的TabBar檢視高度不一定是49的高度。那麼也就是說,我們需要將這紫色的頁面高度進行調整。 (2)調整檢視 在調整檢視之前,我們需要看看TabBarController的檢視,包含哪些子檢視,程式碼如下: for (UIView *subview in self.view.subviews) { // 這裡的self指的是TabBarController物件 NSLog(@"subview : %@", subview); } 通過控制檯列印結果如下: subview : > subview : > 從列印結果我們不難看出,TabBarController的檢視包含2個子檢視,一個是我們非常熟悉的UITabBar檢視,大家可以仔細看看它的frame(尤其是高度),而兩外一個檢視名叫UITransitionView的物件。其實,當我們建立一個TabBarController控制器,它在請求自己的view時,會自動新增2個子檢視,一個是我們非常熟悉的TabBar檢視,另外一個就是UITransitionView。tabBar檢視的作用不言而喻,切換檢視控制器。而UITranstionView檢視作用則是用來承載我們感興趣的內容(間接的載入其他檢視控制器的子檢視)。也就是圖2-1的中的紫色部分。因此,如果我們想控制自定義TabBar檢視的高度(不在是固定的49),我們就需要拉長UITransitionView的高度,即讓紫色的檢視加長。那麼,問題又來了,我們需要在遍歷子檢視時準確的找出UITransitionView,然後修改它的高度,這時,反射就派上用場了。程式碼如下所示: for (UIView *subview in self.view.subviews) { // NSClassFromString() -> 反射機制,通過指定類名 Class class = NSClassFromString(@"UITransitionView"); // 是否屬於自該類 if ([subview isMemberOfClass:class]) { // 將TransitionView物件高度增加9, // 自定義tabBar時檢視時,高度就可以設定為40了 subview.frame = CGRectMake(0, 0, 320, 519+9); } }