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);
}
}
iOS开发之——巧用反射机制的更多相关文章
- iOS开发事件分发机制—响应链—手势影响
1.提纲 什么是iOS的事件分发机制 ? 一个事件UIEvent又是如何响应的? 手势对于响应链有何影响? 2.事件分发机制 2.1.来源 以直接触摸事件为例: 当用户一个手指触摸屏幕是会生成一个UI ...
- iOS开发-消息通知机制(NSNotification和NSNotificationCenter)
iOS中委托模式和消息机制基本上开发中用到的比较多,一般最开始页面传值通过委托实现的比较多,类之间的传值用到的比较多,不过委托相对来说只能是一对一,比如说页面A跳转到页面B,页面的B的值改变要映射到页 ...
- iOS 开发--Objective-C 反射机制
了解反射机制 Objective-C语言中的OC对象,都继承自NSObject类.这个类为我们提供了一些基础的方法和协议,我们可以直接调用从这个类继承过来方法.当然,本篇文章中讲到的反射方法,就在NS ...
- IOS开发—UITableView重用机制的了解
引言 对于一个UITableView而言,可能需要显示成百上千个Cell,如果每个cell都单独创建的话,会消耗很大的内存.为了避免这种情况,重用机制就诞生了. 假设某个UITableView有100 ...
- iOS开发之通知机制
1.通知中心 每一个应用程序都有一个通知中心(NSNotificationCenter)实例,专门负责协助不同对象之间的消息通信 任何一个对象都可以向通知中心发布通知(NSNotification), ...
- iOS开发——OC篇&消息传递机制(KVO/NOtification/Block/代理/Target-Action)
iOS开发中消息传递机制(KVO/NOtification/Block/代理/Target-Action) 今晚看到了一篇好的文章,所以就搬过来了,方便自己以后学习 虽然这一期的主题是关于Fou ...
- iOS开发系列--通知与消息机制
概述 在多数移动应用中任何时候都只能有一个应用程序处于活跃状态,如果其他应用此刻发生了一些用户感兴趣的那么通过通知机制就可以告诉用户此时发生的事情.iOS中通知机制又叫消息机制,其包括两类:一类是本地 ...
- iOS开发——高级技术OC篇&运行时(Runtime)机制
运行时(Runtime)机制 本文将会以笔者个人的小小研究为例总结一下关于iOS开发中运行时的使用和常用方法的介绍,关于跟多运行时相关技术请查看笔者之前写的运行时高级用法及相关语法或者查看响应官方文档 ...
- iOS开发——高级技术&签名机制
签名机制 最近看了objc.io上第17期中的文章 <Inside Code Signing> 对应的中文翻译版 <代码签名探析> ,受益颇深,对iOS代码签名机制有了进一步的 ...
随机推荐
- Linux命令之hwclock - 查询和设置硬件时钟
常用参数 -r, --show 读取并打印硬件时钟(read hardware clock and print result ) -s, --hctosys 将硬件时钟同步到 ...
- UVa1151 Buy or Build
填坑(p.358) 以前天真的以为用prim把n-1条边求出来就可以 现在看来是我想多了 #include<cstdio> #include<cstring> #include ...
- Windows 10 Technical Preview 10041 使用 IIS Express 运行网站应用程序异常
在 Windows 10 中使用 Visual Studio 2013 Ultimate with Update 4 开发网站,9926 的时候还好好的,升到 10041 就不能调试了: “Syste ...
- 【protobuf进阶】通过.proto文件导出C#支持的.cs类文件
protobuf是一个跨平台的消息交互协议,类似xml.json等. protocolbuffer(以下简称PB)是google 的一种数据交换的格式,它独立于语言,独立于平台.google 提供了多 ...
- hive运行query语句时提示错误:org.apache.hadoop.ipc.RemoteException: java.io.IOException: java.io.IOException:
hive> select product_id, track_time from trackinfo limit 5; Total MapReduce jobs = 1 Launching Jo ...
- hadoop编程技巧(4)---总体情况key按类别搜索TotalOrderPartitioner
Hadoop代码测试版:Hadoop2.4 原理:携带MR该程序随机抽样提取前的输入数据,样本分类,然后,MR该过程的中间Partition此值用于当样品排序分组数据.这使得可以实现全球排名的目的. ...
- android 15 activity跳转
从一个屏幕跳到另一个屏幕,一个activity跳转到另一个activity,Intent类用于组件之间传递数据和跳转,组件包括不仅activity. package com.sxt.day04_01; ...
- limit-进程句柄限制
在Linux下面部署应用的时候,有时候会遇上Socket/File: Can’t open so many files的问题,比如还有Squid做代理,当文件打开数到900多时速能就非常快的下降,有可 ...
- java获取当前方法
1.获取当前方法堆栈,我们一般用 StackTraceElement[] stes = Thread.currentThread().getStackTrace(); 想要获取当前方法,切记不够灵活, ...
- css 权威指南笔记(一)
零零散散接触css将近5年,俨然已经成为一个熟练工.如果不是换份工作,我不知道自己差的那么远:在qunar的转正review中我这种“知其然而不知其所以然” 的状况被标明,我才意识到我已停步不前近两年 ...