昨天想手工实现一下类知乎日报的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. Spring jar包功能

    1.spring.jar 是包含有完整发布模块的单个jar 包. 2. org.springframework.aop 包含在应用中使用Spring的AOP特性时所需的类. 3. org.spring ...

  2. bzoj4551 [HEOI2016]树

    题目描述 在2016年,佳媛姐姐刚刚学习了树,非常开心.现在他想解决这样一个问题:给定一颗有根树(根为1),有以下 两种操作:1. 标记操作:对某个结点打上标记(在最开始,只有结点1有标记,其他结点均 ...

  3. BZOJ 3530 [SDOI2014]数数 (Trie图/AC自动机+数位DP)

    题目大意:略 裸的AC自动机+数位DP吧... 定义f[i][x][0/1]表示已经匹配到了第i位,当前位置是x,0表示没到上限,1到上限,此时数是数量 然而会出现虚拟前导零,即前几位没有数字的情况, ...

  4. Maven copy方式列举

    maven copy有很多种方法: 1.maven-antrun-plugin (使用ant复制) <build> <finalName>flex</finalName& ...

  5. MarkDown写作之嵌入LaTeX和HTML

    本系列文章由 @YhL_Leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/49788741 Markdown 是一种 ...

  6. datatable 前台和后台数据格式

    datatable是很强大的前台表格插件,前台定义好表格格式后,后台须要返回指定格式的json数据! 例如以下: 首先是js的定义: var oTable = $('#sample_editable_ ...

  7. C语言之基本算法38—格式化输出10000以内的全部完数

    //穷举法! /* ================================================================== 题目:求10000以内的全部完数,统计数量并以 ...

  8. MongoDB查询、索引和聚合

    初始化mongodb数据库 > use deng switched to db deng > db.createCollection("jingdong") #无參数 ...

  9. 2、Python列表和元组

    2.Python序列 序列是一种数据存储方式,类似于C语言的数组.简单的说序列是一块用来存储多个值的连续内存空间,同一个序列的元素通常是相关的. Python中常用的序列结构有列表.元组.字典.字符串 ...

  10. HTML5 界面元素 Canvas 參考手冊

    HTML5 界面元素 Canvas 參考手冊 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协 ...