UINavigationBar的系统渲染方式

昨天想手工实现一下类知乎日报的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的方法

http://www.cocoachina.com/ios/20150409/11505.html

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-06 03:45:42

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

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

作者:qyvlik链接:http://www.zhihu.com/question/38867614/answer/78583440来源:知乎著作权归作者所有,转载请联系作者获得授权. 做UI啊.如果是桌面应用,QML可以更快速.如果是手机UI,H5绝对占优. 毕竟Qt提供的那一套控件库更适合桌面应用,而当年诺基亚都开发了塞班和米果的QML手机控件库,现在Ubuntu,旗鱼,黑莓都有自己的QML手机控件库. 渲染性能上.QML有绝对统一的接口规范以及渲染机制.(跨平台是这样的). H5桌面系统一

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

今天我们学习如何配置url.如何传参.如何命名.以及渲染的方式,内容大致有以下几个方面. 创建视图函数并访问 创建app django中url规则 捕获参数 路径转换器 正则表达式 额外参数 渲染方式 创建视图并访问 项目中自带的Python文件中,并没有带有视图,因此我们自己创建一个,通常,我们把视图命名views.py. 然后在views.py中,导入头文件  from django.http import HttpResponse 然后我们在views.py中,写一些Python函数,用来

opengl 渲染方式在屏 离屏 CPU

一.概念理解 OpenGL中,GPU屏幕渲染有以下两种方式: On-Screen Rendering 意为当前屏幕渲染,指的是GPU的渲染操作是在当前用于显示的屏幕缓冲区中进行. Off-Screen Rendering 意为离屏渲染,指的是GPU在当前屏幕缓冲区以外新开辟一个缓冲区进行渲染操作. 二.离屏渲染的是是非非 相比于当前屏幕渲染,离屏渲染的代价是很高的,主要体现在两个方面: 创建新缓冲区 要想进行离屏渲染,首先要创建一个新的缓冲区. 上下文切换 离屏渲染的整个过程,需要多次切换上下文

关于投票系统刷票方式原理(突破ip限制刷票PHP版)

先说一点:其实不算是突破ip限制,因为事实上,这个限制是在服务器端的,客户端在牛逼,也突破不了..只是可以一直刷多次票罢了 一个朋友突然发了一个网站,让我帮她投投票..我这人一项比较好说话,就帮她投了.顺便分析了这个网站,发现这个网站的投票系统有ip限制,但是投票是一个ajax请求.那么办法就出来了. 很多投票PC网站都是依靠限制ip,来限制投票人数.那么我用curl伪造IP,那么就可以轻易制造多个IP进行投票. 下面贴上PHP代码: 由于对方是GET AJAX请求,我这里就贴上GET方法,PO

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

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

模版+数据分离渲染方式的设计与实现

一 背景 1 现状 模版存放于后端 php输出页面html结构进行页面渲染 ajax请求,需要重渲结构时,php输出html结构 builder制作静态页面结构 jser完成页面交互逻辑开发 2 不足 模版数据无法存储本地,导致每次打开页面请求数据量巨大 数据每次要从接入层web服务器读取,没有合理利用CDN加速静态模版内容 联调成本较大,不利于前端控制页面展示和交互开发 3 解决方案 后端直接输出json数据 试图把渲染页面的模版存放在前端 4 技术路线 5 理论意义 利用CDN保存html模

设置IE渲染方式默认为最高(转)

现在有很多人的IE浏览器都升级到IE9以上了,所以这个时候就有又很多诡异的事情发生了,例如现在是IE9的浏览器,但是浏览器的文档模式却是IE8: 为了防止这种情况,我们需要下面这段代码来让IE的文档模式永远都是最新的: <!-- 避免IE使用兼容模式 --> <meta http-equiv="X-UA-Compatible" content="IE=edge"> 另一种更优化写法: <meta http-equiv="X-U

【案例实战】餐饮企业分店財务数据分析系统解决方式:业务需求

[案例实战]餐饮企业分店財务数据分析系统解决方式:业务需求 一.建设目的 某餐饮集团须要将每一个分店的財务状况进行分析,眼下使用的是excel来存储查看各区域的收入情况,每一个区域各年月的收入情况汇总数据都是通过多sheet的方式展示,因为此餐饮集团是一个比較大型的餐饮集团,非常多区域都有分店.所以,单是针对收入情况,就须要做非常多个excel来进行收入情况汇总存储.这样导致查询历史数据非常麻烦.不利于数据的存档规整.制作成本太高,浪费有效人力资源等非常多弊端.因此採用数据分析系统来解决这些弊端

linux应用开发-系统函数方式文件编程

linux应用开发-系统函数方式文件编程 一 系统调用 指调用系统的函数库 二 文件描述符 性质:一个数字 打开的文件对应一个数字即一个文件描述符 三 常用函数 1 打开文件 open 2 创建文件 creat 3 关闭文件 close 4 读文件 read 5 写文件 write 6 定位文件 lseek 7 复制文件描述符 dup 三 man命令查找顺序 1 命令 man read 2 系统调用函数 man 2 read 3 库函数 四 linux下main函数参数 void main(in