1. 程式人生 > >iOS開發—巧用反射機制

iOS開發—巧用反射機制

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);
  }
  }