博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UIView 的 alpha,hidden,opaque 属性之间的关系影响 图层混用
阅读量:6847 次
发布时间:2019-06-26

本文共 1232 字,大约阅读时间需要 4 分钟。

前言

在看性能优化文章里, 看到不少提到要把相应控件设置成不透明,特别是在滚动页面上,但是没有看到深入说明为什么要这样去做, 如果控件是透明的将会带来什么影响,还有当中涉及到的知识点都没有提出来.

我们先来看这三个影响视图显示的属性

alpha

显示器是由一个个点的像素组成,每个像素都是由 RGBA 颜色空间来表示, alpha 即代表 A. 它是一个 CGFloat 浮点值类型, 由 0~1 范围组成, 0表示透明, 1表示不透明.

  • 当我们设置一个 View 为透明时, 其 subView 会受其影响会直接隐藏. 不管其 Alpah值为多少.
  • 当一个 View 为透明时, 其不会具有相应功能,响应链会直接将事件直接传递到其下一个视图。

hidden

其是一个 Bool 值.

当其设置成 No 时, 与 alpha 设置成 0 同理.

opaque

此属性表示不透明, 一般控件此属性默认都是 Yes, 即表示不透明. 但是 UIButton 子类默认是 No, 这个要注意.

如果我们将 View 的 opaque 属性设置成 No, 并不是使其变成透明, 不知道这里是系统对其作了一层处理还是什么原因,总之一个 View 我们将其设置成 No 之后, 其还是正常展示, 估计这个属性设置成No 之后还要看其 Alpha 值来进行渲染. 所以改变此属性并不会使其变成透明.

但是这个属性的作用是什么呢?

图层混用

看到2013 年的文章, 当两个视图相交到一起的时候, 如果将其中一个视图此属性改成 No, 也就是透明, 则会按照此公式来计算混合图层 RGBA

R = S + D * ( 1 – Sa )

通过 GPU 来计算出一个 混合后的颜色值, 然后进行展示, 假如此图层出现在滚动页面中, 则是相对影响性能的,因为屏幕一般滚动起来会涉及到 FPS, 一旦 FPS 过低,很容易就通过肉眼看到卡顿的感觉, FPS理想状态要保持在 60左右. 1S 刷频 60次。

回到图层混用, 但是现在我使用两个相交的 View 其 opaque 属性设置成 No, 显出出来的图层并没有出现图层混用的效果. 猜测系统已经对此属性进行了优化,所以此属性已经不会再造成图层混用。

  • 为什么会出现图层混用,当两个视图相交在一起时,假如上面的视图 alpha 值不为1,的情况下, 就会出现一个混合图层的颜色, 因为其透明的缘故无法完全遮挡住下面的图层, 所以 GPU 会 通过 公式去进行计算,因此有时候会相应的影响性能,
    假设其值为1的话 R = S + D * (1 - 1) 则为 R = S. 即计算会很快。 未必真正计算是通过此公式。可能会更加复杂。
    所以要尽量避免, 特别是在滚动视图。

参考

最后

希望此篇文章对您有所帮助,如有不对的地方,希望大家能留言指出纠正。

谢谢!!!!!
学习的路上,与君共勉!!!

本文原创作者:. 欢迎转载,请注明出处和

你可能感兴趣的文章
看我linux如何防SYN***
查看>>
面向接口编程详解(二)——编程实例
查看>>
简单演示django使用二
查看>>
墨菲定律(侥幸定律)
查看>>
DNS之智能DNS二(Windows)
查看>>
批量修改文件后缀名的方法(当前目录及子目录)
查看>>
Linux Shell脚本攻略
查看>>
[信息图]手机进化史
查看>>
我的友情链接
查看>>
我的友情链接
查看>>
提高你的编码速度–Eclipse 快捷健
查看>>
Linux下自动备份Oracle数据库并删除指定天数前的备份
查看>>
如何找回从垃圾箱删除的邮件Outlook2010,2013
查看>>
我的友情链接
查看>>
BGP-4的多协议扩展MP-BGP
查看>>
Nginx+Tomcat+Memcached实现tomcat集群和session共享
查看>>
rhel6+nginx+php+php-fpm 防火墙配置问题
查看>>
CreateOleObject dll 卡死 问题 原因
查看>>
RAD Studio Static Runtime Libraries c++builder去掉依赖cc3260mt
查看>>
话里话外:BPM软件能否成为流程管理的终结者?
查看>>