UITabBar - 深度解剖
for (UIView *tabbarbutton in self.subviews) {
// NSLog(@"%@",tabbarbutton);
if ([tabbarbutton isKindOfClass:NSClassFromString(@"_UITabBarBackgroundView")]) {
[tabbarbutton setValue:[UIColor orangeColor] forKeyPath:@"backgroundColor"];
for (UIView *obj in tabbarbutton.subviews) {
NSLog(@"obj:%@",obj);
obj.backgroundColor = [UIColor redColor];
for (UIView *v1 in obj.subviews) {
NSLog(@"v1_____:%@",v1);
if ([v1 isKindOfClass:NSClassFromString(@"_UIBackdropEffectView")]) {
v1.backgroundColor = [UIColor blueColor];
[v1 removeFromSuperview];
}
}
if ([obj isKindOfClass:NSClassFromString(@"_UIBackdropView")]) {
[obj removeFromSuperview];
}
}
}
if ([tabbarbutton isKindOfClass:NSClassFromString(@"UITabBarButton")]) {
for (UIView *view in tabbarbutton.subviews) {
// NSLog(@"%@",view);
if ([view isKindOfClass:NSClassFromString(@"UITabBarSelectionIndicatorView")]) {
view.backgroundColor = [UIColor redColor];
view.layer.borderWidth = 2;
view.layer.borderColor = [UIColor blackColor].CGColor;
}
}
}
}
遍历的正是上图的结构,中间那个加号按钮是我自己另外加上去的,其它四个则分别代表一个控制器的tabbar
控制器是使用这个方法添加上去的:
如果你不想用许多button、view定制tabbar,那你就需要彻底的了解系统tabbar的结构,然后再去修改他的控制属性和结构,这遍文章正是对UITabBar彻底的解剖
第一层的遍历结果:
<_UITabBarBackgroundView: 0x12fe364a0; frame = (0 0; 375 49); autoresize = W; userInteractionEnabled = NO; layer = <CALayer: 0x1702217c0>>
看这一个的frame为(0 0; 375 49)及名字,那肯定是tabbar的背景图了,这个背景图下边还有好几层view,所以如你遍历到时这里的时候去设置_UITabBarBackgroundView的背景色的话是看不见的,因为这个_UITabBarBackgroundView在倒数第二层,最底有一个view暂时还不知道是干什么的,结合代码看上图:
_UITabBarBackgroundView 的下层 >> _UIBackdropView >> _UIBackdropEffectView 此时如果去改_UIBackdropEffectView的backcolor的话,是能看出效果的,只是好像有自带的半透明效果无法改变,或者我们把_UIBackdropView这个view removeFromSuperview,再设置_UITabBarBackgroundView的backcolor就能看到效果了
这一个名字是UIButton。那肯定是我另外添加的中间那个按钮
<UIButton: 0x12fd12650; frame = (155.5 2.5; 64 44); opaque = NO; layer = <CALayer: 0x174223680>>
下面这四个UITabBarButton分别代表四个控制器的tabbar按钮
<UITabBarButton: 0x12fd14620; frame = (2 1; 90 48); opaque = NO; layer = <CALayer: 0x174223a80>>
<UITabBarButton: 0x12fd19d00; frame = (96 1; 90 48); opaque = NO; layer = <CALayer: 0x1742246e0>>
<UITabBarButton: 0x12fd1d7e0; frame = (190 1; 89 48); opaque = NO; layer = <CALayer: 0x174224e20>>
<UITabBarButton: 0x12fe2fba0; frame = (283 1; 90 48); opaque = NO; layer = <CALayer: 0x170233e80>>
下面这一个UIImageView则是整条tabbar上边边缘的一个view,一般这个我们不会去改它,如下图,红色线条的位置:
<UIImageView: 0x12fe1cab0; frame = (0 -0.5; 375 0.5); autoresize = W; userInteractionEnabled = NO; layer = <CALayer: 0x1702356a0>>
第二层的遍历结果:
UITabBarSelectionIndicatorView代表上图中竖直红色黑色的那块view,注意:这个view需要在设置了这个self.selectionIndicatorImage属性时才会存在
<UITabBarSelectionIndicatorView: 0x14f6278f0; frame = (0 0; 90 48); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x174224cc0>>
UITabBarSwappableImageView就是上图中红色方块的view
<UITabBarSwappableImageView: 0x14f52a440; frame = (0 0; 30 30); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x170221d80>>
UITabBarButtonLabel 就不用多说了,就是下面那个label了,看text也可以
<UITabBarButtonLabel: 0x14f528400; frame = (0 0; 26 16); text = '首页'; opaque = NO; userInteractionEnabled = NO; layer = <_UILabelLayer: 0x170281180>>
<UITabBarSwappableImageView: 0x14f619f30; frame = (0 0; 30 30); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x174223840>>
<UITabBarButtonLabel: 0x14f61aa50; frame = (0 0; 26 16); text = '消息'; opaque = NO; userInteractionEnabled = NO; layer = <_UILabelLayer: 0x17409eb90>>
<UITabBarSwappableImageView: 0x14f622080; frame = (0 0; 30 30); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x174223f80>>
<UITabBarButtonLabel: 0x14f6216d0; frame = (0 0; 26 16); text = '发现'; opaque = NO; userInteractionEnabled = NO; layer = <_UILabelLayer: 0x17409f590>>
<UITabBarSwappableImageView: 0x14f6274b0; frame = (0 0; 30 30); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x174224ac0>>
<UITabBarButtonLabel: 0x14f626060; frame = (0 0; 13 16); text = '我'; opaque = NO; userInteractionEnabled = NO; layer = <_UILabelLayer: 0x17409fae0>>
UITabBar - 深度解剖的更多相关文章
- C语言深度解剖读书笔记(6.函数的核心)
对于本节的函数内容其实就没什么难点了,但是对于函数这节又涉及到了顺序点的问题,我觉得可以还是忽略吧. 本节知识点: 1.函数中的顺序点:f(k,k++); 这样的问题大多跟编译器有关,不要去刻意追求 ...
- 深度解剖dubbo源码
-----------学习dubbo源码,能给你带来什么好处?----------- 1.提升SOA的微服务架构设计能力 通过读dubbo源码是一条非常不错的通往SOA架构设计之路,毕竟SOA的服 ...
- C语言深度解剖读书笔记
开始本节学习笔记之前,先说几句题外话.其实对于C语言深度解剖这本书来说,看完了有一段时间了,一直没有时间来写这篇博客.正巧还刚刚看完了国嵌唐老师的C语言视频,觉得两者是异曲同工,所以就把两者一起记录下 ...
- 【转】 C语言深度解剖读书笔记(1.关键字的秘密)
本文出处:http://blog.csdn.net/mbh_1991/article/details/10149805 开始本节学习笔记之前,先说几句题外话.其实对于C语言深度解剖这本书来说,看完了有 ...
- [转] 深度解剖DIV+CSS工作原理
本文和大家重点讨论一下DIV+CSS工作原理,在一般情况的DIV+CSS开发静态html网页时,我们把html和CSS是分开的,形成html页面和CSS文件. DIV+CSS原理解剖 在一般情况的DI ...
- 深度解剖dubbo源码---01dubbo的架构原理-探索.mp4
02内核解剖-dubbo自己的SPI实现.mp4 https://blog.csdn.net/prestigeding/article/details/80795708 https://segment ...
- Netfilter深度解剖
在网络上发现这个Netfilter写的很好的系列文章,为了便于后期寻找,特此标注下博客地址,感谢大大神提供. ---------------------------分割线开始---- ...
- 《C语言深度解剖》面试题整理
请在40分钟内完成以下20道C语言基础题.在没有任何提示的情况下,如果能得满分,那么你可以扔掉本书了,你的水平已经大大超过了作者:如果能的80分以上,说明你的C语言基础还不错,学习本书可能会比较轻松: ...
- 深度解剖sesssion运行原理
已经大半年没有更新博客了,一方面有比博客更重要的事情要做,另外一方面也没有时间来整理知识,所以希望在接下来的日子里面能够多多的写博客来与大家交流 什么是session session的官方定义是:Se ...
随机推荐
- [iOS基础控件 - 5.1] UIScrollView
A.需要掌握 UIScrollView 是一个能够滚动的视图控件,可以用来展示大量内容,如手机的“设置” 1.常见属性 2.常用代理方法 3.缩放 4.UIScrollView和UIPageContr ...
- 74LS164 for stm32 源码下载
在单片机系统中, 如果并行口的IO资源不够,而串行口又没有其他的作用, 那么我们可以用74LS164来扩展并行IO口,节约单片机资源. 74LS164是一个串行输入并行输出的移位寄存器 ...
- UVa 二分图匹配 Examples
这些都是刘汝佳的算法训练指南上的例题,基本包括了常见的几种二分图匹配的算法. 二分图是这样一个图,顶点分成两个不相交的集合X , Y中,其中同一个集合中没有边,所有的边关联在两个集合中. 给定一个二分 ...
- Theme使用的几点注意事项
Theme.Holo主题在android4.0 及其以上不需要任何支持包,继承Activity即使用,但google不推荐该用法 Theme.Material主题在android5.0及其以上不需要依 ...
- Oracle- 日期格式和数字类型处理
更新数据库时间格式的显示格式的语句:(alter session set nls_date_format='YYYY-MM-dd'); to_date("要转换的字符串",&quo ...
- DES 算法的 C++ 与 JAVA 互相加解密
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...
- cocos2dx 运动+旋转动画 CCSequence CCAnimation CCAnimate CCMoveTo CCCallFuncN
cocos2dx 动画是个非常奇妙的东西~~. 这里看到的是一个物体,在运动的过程中会不断地翻转的过程. 两个动画一起来~~ 以下的代码中涉及到:CCAnimation(补间动画 ) CCAnima ...
- git克隆远程项目分支到本地对应分支
最近公司改用git了,研究了一下如何把远程的代码克隆到本地. 1. 配置对应信息 git config --global user.name git config --global user.emai ...
- Asp.Net Mvc5 之Controller
经过前面介绍了路由系统之后,我们知道任何一个请求在经过asp.net url路由系统的拦截之后,会生成以controller/action 名称为核心的路由数据.asp.net mvc 根据此解析出目 ...
- android学习日记20--连接组件之Intent和IntentFilter
上次刚了解完Android的四大组件,现在学习组件间通信的Intent和IntentFilter 一.Intent 1.简述 Intent(意图)在应用程序运行时连接两个不同组件,是一种运行时的绑定机 ...