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

原文地址:https://www.cnblogs.com/isItOk/p/5041176.html