昨天想手工实现一下类知乎日报的Navigation Bar的动态颜色改变,但不管怎么设置Navigation Bar的 backgroundColor barTintColor alpha參数都达不到想要的效果。所以就试了试用View Debugging来分析一下系统Navigation Bar的渲染层次,以达到动态改变NavigationBar的背景颜色的功能

       
//測试代码一

       
self.navigationController?.navigationBar.barTintColor
=
UIColor.yellowColor()

       
self.navigationController?.navigationBar.alpha
=
0.5
       
self.navigationController?

.navigationBar.backgroundColor
=
UIColor.
greenColor()


得到的渲染效果例如以下



我们能够看到位于最上层的是navigationBar的barTintColor层,而navigationBar的bar的backgroundColor会被遮挡掉。在这里我尝试设置了alpha值。可是并没起到作用。那个蓝色的层是我在主view和navigationBar的中间垫了一层蓝色的view


       
//測试代码二
       
self.navigationController?

.navigationBar.hidden
=
true


可是我们从上一张渲染图中能够看到,在backgroundColor和barTintColor这两层之间还有若干层,这些层和navigationBar有什么关系呢,为了探究这个问题,我把navigationBar设置为hidden



能够看到上面的那几层view全是因为navigationBar产生的。而我终于想要实现的由全透明到不透明的渐变中,全透明的效果就是这样。所以我首先尝试在加入navigationBar的条件下实现和其hidden一样的效果

       
//測试代码三

       
self.navigationController?.navigationBar.barTintColor
=
nil
       
self.navigationController?.navigationBar.backgroundColor
=
nil

我做的第一件事是将能够被染色的两个颜色层的颜色设置为空,即无色,但效果有些奇怪



为了更清晰,我在StoryBoard里又加入了左右的barButtonItem和中间的title,依照渲染图来看,这正是我想要的效果了,但实际在模拟器中的效果却不一样



结果是这种。即便两个颜色层都无色。却仍然另一层半透明效果在

       
//測试代码四

       
self.navigationController?

.navigationBar.barTintColor
=
UIColor.clearColor()

       
self.navigationController?.navigationBar.backgroundColor
=
UIColor.
greenColor()

而后我又想到了用clearColor来实现透明效果,但结果反而更出乎意料




我尝试了几次,barTintColor的颜色一旦被设置为clearColor就会变为黑色,barStyle为default。可是backgroundColor设置为clearColor的时候就会是正常的透明色

       
//測试代码五

       
self.navigationController?.navigationBar.barTintColor
=
UIColor.yellowColor()

       
self.navigationController?

.navigationBar.alpha
=
0

       
self.navigationController?

.navigationBar.backgroundColor
=
UIColor.
greenColor()


为了验证alpha的作用,我特地将alpha调为0来观察它和第一个渲染图的差别,结果是,没有差别,改变alpha什么都不会变

       
//測试代码六

       
self.navigationController?

.navigationBar.barTintColor
=
UIColor.yellowColor()

       
self.navigationController?.navigationBar.translucent
=
false

       
self.navigationController?

.navigationBar.backgroundColor
=
UIColor.greenColor()


我又考虑是不是translucent參数为真才使得半透明效果一直存在,所以我将其设置为假,得到的渲染图例如以下



当translucent为假的时候,barTintColor层会和主View的第一层SubView平级

       
//測试代码七
       
self.navigationController?.navigationBar.barTintColor
=
UIColor.yellowColor().colorWithAlphaComponent(0)

       
self.navigationController?

.navigationBar.alpha
=
0

       
self.navigationController?

.navigationBar.backgroundColor
=
UIColor.
greenColor()


我又尝试了更改barTintColor颜色的透明度和插入背景图片再更改透明度,最后发现alpha什么卵用都没有

所以在这得到的结论是仅仅要navigationBar存在。利用public API就无法做到全透明效果

可是事情总有还有一种解决方法,我通过查资料发现曾经有人用OC实现了这样的效果
效果图例如以下




用了一种Hack的方法



UINavigationBar的系统渲染方式的更多相关文章

  1. QML的渲染方式相较于之前的版本也有了重大的更新(CPU线程负责绘制,GPU线程负责渲染),还有好多经常评论 good

    作者:qyvlik链接:http://www.zhihu.com/question/38867614/answer/78583440来源:知乎著作权归作者所有,转载请联系作者获得授权. 做UI啊.如果 ...

  2. django中url路由配置及渲染方式

    今天我们学习如何配置url.如何传参.如何命名.以及渲染的方式,内容大致有以下几个方面. 创建视图函数并访问 创建app django中url规则 捕获参数 路径转换器 正则表达式 额外参数 渲染方式 ...

  3. Django 学习第二天——URL路由及模板渲染方式

    URL 的概念及格式: URL的引入:客户端:知道了url 就可以去进行访问: 服务端:设置好了url,别人才能访问到我 URL :网址(全球统一资源定位符):由 协议,域名(ip port) ,路径 ...

  4. EasyPlayer RTSP Windows播放器D3D,GDI的几种渲染方式的选择区别

    EasyPlayer-RTSP windows播放器支持D3D和GDI两种渲染方式,其中D3D支持格式如下: DISPLAY_FORMAT_YV12 DISPLAY_FORMAT_YUY2 DISPL ...

  5. iOS开发中的错误整理,启动图片设置了没有效果;单独创建xib需要注意的事项;图片取消系统渲染的快捷方式

    一.启动图片设置了没有效果 解决方案:缓存啊!卸了程序重新安装吧!!!!! 二.单独创建xib需要注意的事项 三.图片取消系统渲染的快捷方式

  6. document.compatMode(判断当前浏览器采用的渲染方式)

    转载自:http://www.cnblogs.com/fullhouse/archive/2012/01/17/2324706.html IE对盒模型的渲染在 Standards Mode和Quirk ...

  7. OpenGL中的渲染方式—— GL_TRIANGLE_STRIP

    OpenGL值绘制三角形的方式常用的有三种,分别是GL_TRIANGLES.GL_TRIANGLE_STRIP.GL_TRIANGLE_FAN,其效果如依次是: 从左起:第一个方式是GL_TRIANG ...

  8. 02-url路由分配及模板渲染方式

    本章主要内容 1.url基本概念及格式 2.path和re_path 3.模板路径配置 4.模板渲染方式 1.url基本概念及格式 URL(uniform Resoure Locator)统一资源定位 ...

  9. SAP系统接口方式:

    SAP系统接口方式: 1.PI - 信使中间件 (大公司多选择) 数据: SAP- PI- U8 U8- PI- SAPPI 底层用的还是webservice 技术优点:实时性高: 可处理大数据(在调 ...

随机推荐

  1. oracle根据成绩排名查询某个名次段的人员

    先说一下表结构  名字name  分数fenshu   表名test1,以下查询的是成绩排名为第三名和第四名,这个模板让你查随意排名段的人 select name,fenshu,mc from (se ...

  2. mysql中如何查看某个数据库或表占用的磁盘空间

    查整个库的状态:select concat(truncate(sum(data_length)/1024/1024,2),'MB') as data_size,          concat(tru ...

  3. puppet介绍与安装

    puppet是什么puppet是一种基于ruby语言开发的Lnux.Unix.windows平台的集中配置管理系统.它使用自有的puppet描述语言,可管理配置文件file.用户user.cron任务 ...

  4. ElementUi rules表单验证

    ElementUi 表单验证 工作中常用到的JS验证 可以在pattern中书写正则,并且配合elementUI进行表单验证. pattern 属性规定用于验证输入字段的模式.模式指的是正则表达式. ...

  5. C++容器(三):pair类型

    pair类型 在开始介绍关联容器之前,我们有必要了解一种与之相关的标准库类型–pair类型. 操作 含义 pair<T1, T2> p1 创建一个空的pair对象,它的两个元素分别为T1和 ...

  6. 继续过Hard题目.周五

      # Title Editorial Acceptance Difficulty Frequency   . 65 Valid Number     12.6% Hard    . 126 Word ...

  7. Java实现二叉树的创建、递归/非递归遍历

    近期复习数据结构中的二叉树的相关问题,在这里整理一下 这里包含: 1.二叉树的先序创建 2.二叉树的递归先序遍历 3.二叉树的非递归先序遍历 4.二叉树的递归中序遍历 5.二叉树的非递归中序遍历 6. ...

  8. Android中的跨进程通信方法实例及特点分析(一):AIDL Service

    转载请注明出处:http://blog.csdn.net/bettarwang/article/details/40947481 近期有一个需求就是往程序中增加大数据的採集点,可是由于我们的Andro ...

  9. SQL Server 2008 备份数据库

    1.打开SQL , 找到要备份的数据库 , 右键 >> 任务 >>备份 2.弹出 [ 备份数据库对话框 ] ,如图: 3.点击加入 [ button ] . 例如以下图: 4. ...

  10. CUDA学习笔记(四)

    昨天一直在写ben的作业.总结一下周一的cuda情况. cuda程序需要用到一些设置的参数,如argv[],另外cuda读入文件特别苛刻,只能采用C的方式,而且对w+,r的使用只有试通才行. 卧底天外 ...