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);
}
}
posted on 2015-12-12 14:20 🌞Bob 阅读(555) 评论(0) 编辑 收藏 举报