昨天想手工实现一下类知乎日报的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. Hadoop2.x 关于日志文件位置

    查看日志是发现Hadoop问题和解决Hadoop问题的第一步. 开始我不知道该去哪找日志,后来我发现在我启动节点的时候,有打印信息以及明确告诉了日志写在哪. [root@master hadoop]# ...

  2. 浏览器解析,HTTP/HTTPS、TCP/IP、WebSocket协议

    浏览器相关 浏览器对同一个域名有连接数限制,大部分是 6. 浏览器指的是 Chrome.Firefox,而浏览器内核则是 Blink.Gecko,浏览器内核只负责渲染,GUI 及网络连接等跨平台工作则 ...

  3. PL SQL Developer使用总结

    如果OS为windows 7 64位系统,Oracle版本为 Oracle 11g 64 安装PL SQL Developer 请参考    http://myskynet.blog.51cto.co ...

  4. Python学习笔记(二):字符串类型

    在上一篇随笔(https://www.cnblogs.com/g-qiang/p/10448813.html)中,说到 Python 有六种标准数据类型,而数字类型和字符串类型又是其中基本的数据类型. ...

  5. Qt之pro配置多个子工程/子模块

    简述 进行Qt项目开发的时候,尤其是大型项目,经常涉及多工程/多模块问题,其主要思想还是模块化,目的是为了降低程序复杂度,使程序设计.调试和维护等操作简单化. 简述 配置 效果 多工程 多模块 更多参 ...

  6. hdu 4771 求一点遍历全部给定点的最短路(bfs+dfs)

    题目如题.题解如题. 因为目标点最多仅仅有4个,先bfs出俩俩最短路(包含起点).再dfs最短路.)0s1A;(当年弱跪杭州之题,现看如此简单) #include<iostream> #i ...

  7. Android数据分批载入-滑动究竟部自己主动载入列表

    Android数据分批载入-滑动究竟部自己主动载入列表 2014年5月9日 摘自:<Android高级开发实战-ui.ndk与安全> 本博文介绍怎样进行数据分批载入,在应用开发其中会常常使 ...

  8. The broken pedometer-纯暴力枚举

    The broken pedometer Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu i ...

  9. Minikube之Win10单机部署Kubernetes(k8s)自动化容器操作的开源平台

    Minikube之Win10单机部署 Kubernetes(k8s)是自动化容器操作的开源平台,基于这个平台,你可以进行容器部署,资源调度和集群扩容等操作.如果你曾经用过Docker部署容器,那么可以 ...

  10. Laravel-路由组和中间件

    Laravel-路由组和中间件 标签(空格分隔): php 定义路由组 Route::group(['prefix'=>'Anime'], function(){ Rout::match(['g ...