UIView不透明的属性

joh*_*ers 19 iphone objective-c uiview ipad

opaque默认情况下,UIView 的属性始终设置为"YES".但是UIView类引用说明了这一点:

预计不透明视图将使用完全不透明的内容填充其边界 - 也就是说,内容的alpha值应为1.0.如果视图不透明并且未填充其边界或包含完全或部分透明的内容,则结果是不可预测的.

由于更改alpha视图非常常见,尤其是在转换或动画期间,因此上述语句意味着如果您要更改属性opaque,NO则必须始终手动设置alpha.

但我从未手动调整过opaque,也没有任何明显的症状.有必要考虑这个问题吗?

rob*_*off 14

答案是iOS足够聪明,可以识别出如果您的视图alpha小于1,则需要在视图后面绘制内容,而不管视图的opaque属性如何.

回应评论:从我有限的实验中,我不认为视图的opaque属性有任何影响.(我认为文档是错误的.)视图的图层opaque属性确实有效:它控制CGContext传递的是否drawRect:具有alpha通道.如果图层的opaque属性为YES,则上下文没有alpha通道(并且被视为每个像素的alpha值为1.0).

更改视图的opaque属性对图层的opaque属性没有影响.这与(例如)视图的alpha属性不同,后者只是图层opacity属性的包装.

理论上,已经证明该opaque属性允许他们优化绘图,Apple可以在未来实现该优化.在实践中,这样做可能会破坏很多应用程序,因此他们可能不会对与旧SDK相关联的应用程序进行此类更改.(他们有能力使UIKit的行为有所不同,具体取决于应用与哪个版本相关联.)

  • 但这并没有回答这个问题......正如@andrewx所说:如果你忽略了文档并使用'opacity = YES`的透明区域,一切似乎都没问题.除了文档错误的事实之外,基于文档中描述的属性值(未发布)的优化似乎根本不会发生.或者如果确实如此,文档没有正确描述.问题是:我应该照顾房产,如果是这样,为什么?性能?如果我不这样做会有糟糕的渲染吗?任何人的经历?重现? (3认同)
  • @rob mayoff 感谢您的编辑。我在最后一个小时做了一些测试,并观察到了你所描述的情况。我有一个全屏滚动视图的应用程序,其中包含较小的滚动视图作为行,每个滚动视图包含很多子视图,有很多子视图具有透明背景甚至阴影。我们在滚动时遇到了一些性能问题,我们通过删除透明度和阴影来解决。但是,对于我现在的测试,我打开/关闭了透明度、阴影和不透明属性:在任何配置中,不透明属性的更改对正确渲染、性能或内存使用都没有任何影响。 (2认同)