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 - 深度解剖的更多相关文章

  1. C语言深度解剖读书笔记(6.函数的核心)

    对于本节的函数内容其实就没什么难点了,但是对于函数这节又涉及到了顺序点的问题,我觉得可以还是忽略吧. 本节知识点: 1.函数中的顺序点:f(k,k++);  这样的问题大多跟编译器有关,不要去刻意追求 ...

  2. 深度解剖dubbo源码

    -----------学习dubbo源码,能给你带来什么好处?----------- 1.提升SOA的微服务架构设计能力   通过读dubbo源码是一条非常不错的通往SOA架构设计之路,毕竟SOA的服 ...

  3. C语言深度解剖读书笔记

    开始本节学习笔记之前,先说几句题外话.其实对于C语言深度解剖这本书来说,看完了有一段时间了,一直没有时间来写这篇博客.正巧还刚刚看完了国嵌唐老师的C语言视频,觉得两者是异曲同工,所以就把两者一起记录下 ...

  4. 【转】 C语言深度解剖读书笔记(1.关键字的秘密)

    本文出处:http://blog.csdn.net/mbh_1991/article/details/10149805 开始本节学习笔记之前,先说几句题外话.其实对于C语言深度解剖这本书来说,看完了有 ...

  5. [转] 深度解剖DIV+CSS工作原理

    本文和大家重点讨论一下DIV+CSS工作原理,在一般情况的DIV+CSS开发静态html网页时,我们把html和CSS是分开的,形成html页面和CSS文件. DIV+CSS原理解剖 在一般情况的DI ...

  6. 深度解剖dubbo源码---01dubbo的架构原理-探索.mp4

    02内核解剖-dubbo自己的SPI实现.mp4 https://blog.csdn.net/prestigeding/article/details/80795708 https://segment ...

  7. Netfilter深度解剖

         在网络上发现这个Netfilter写的很好的系列文章,为了便于后期寻找,特此标注下博客地址,感谢大大神提供.     ---------------------------分割线开始---- ...

  8. 《C语言深度解剖》面试题整理

    请在40分钟内完成以下20道C语言基础题.在没有任何提示的情况下,如果能得满分,那么你可以扔掉本书了,你的水平已经大大超过了作者:如果能的80分以上,说明你的C语言基础还不错,学习本书可能会比较轻松: ...

  9. 深度解剖sesssion运行原理

    已经大半年没有更新博客了,一方面有比博客更重要的事情要做,另外一方面也没有时间来整理知识,所以希望在接下来的日子里面能够多多的写博客来与大家交流 什么是session session的官方定义是:Se ...

随机推荐

  1. hdu 1595 find the longest of the shortest【最短路枚举删边求删除每条边后的最短路,并从这些最短路中找出最长的那条】

    find the longest of the shortest Time Limit: 1000/5000 MS (Java/Others)    Memory Limit: 32768/32768 ...

  2. [iOS基础控件 - 6.1] 汽车品牌列表 UITableView多项显示

    A.实现思路 1.拖入UITableView 2.拖曳.连线UITableView控件 3.Controller遵守UITalbeViewDataSource协议 4.设置UITableView的da ...

  3. Mac OS环境下媒体文件分割工具mediafilesegmenter的简单使用(生成M3U8 TS文件)

    mediafilesegmenter是苹果开发的一款用于分割媒体文件的工具,其功能与mediastreamsegmenter相似,但操作更简单. * 具体可以对比博客中的另一篇简介<Mac OS ...

  4. 使用CSS3和jQuery可伸缩的搜索条

    使用CSS3和jQuery可伸缩的搜索条 helloweba.com 作者:月光光 时间:2013-12-09 21:23 标签: CSS3 jquery 搜索条在我们网站是必不可少的,尤其是在有限的 ...

  5. Datatable的Select()方法简介

    DataTable是我们在进行开发时经常用到的一个类,并且经常需要对DataTable中的数据进行筛选等操作,下面就介绍一下Datatable中经常用到的一个方法——Select,微软提供了四个函数的 ...

  6. (Map)利用Map,完成下面的功能:  从命令行读入一个字符串,表示一个年份,输出该年的世界杯冠军是哪支球队。如果该 年没有举办世界杯,则输出:没有举办世界杯。  附:世界杯冠军以及对应的夺冠年份,请参考本章附录。 附录 (Map)在原有世界杯Map 的基础上,增加如下功能: 读入一支球队的名字,输出该球队夺冠的年份列表。 例如,读入“巴西”,应当输出 1958 1962 1970 1

    package homework001; import java.util.HashMap; import java.util.Scanner; public class Map { public s ...

  7. java.io.File中的pathSeparator与separator的区别

    先总的说一下区别:File.pathSeparator指的是分隔连续多个路径字符串的分隔符,例如:java   -cp   test.jar;abc.jar   HelloWorld就是指“;” Fi ...

  8. jquery 源码分析学习地址

    http://www.ccvita.com/121.htmljQuery工作原理解析以及源代码示例http://www.cnblogs.com/haogj/archive/2010/04/19/171 ...

  9. JavaScript中Get和Set访问器的实现

    我们常用的实现方法可能是这样的: function Field(val){ var value = val; this.getValue =function(){ return value; }; t ...

  10. (转)如何在JavaScript与ActiveX之间传递数据3

    本文研究如何在JS等脚本语言与ActiveX控件之间通信,如何传递各种类型的参数,以及COM的IDispatch接口.使用类似的方法,可以推广到其他所有脚本型语言,如LUA,AutoCad等.本文将研 ...