UIView 属性 hidden = YES vs alpha = 0.0f
Posted
技术标签:
【中文标题】UIView 属性 hidden = YES vs alpha = 0.0f【英文标题】:UIView properties hidden = YES vs alpha = 0.0f 【发布时间】:2015-04-28 12:42:27 【问题描述】:我一直在寻找这些案例的答案和一种“最佳实践”,因为对于任何试图处理 UI 和 UIKit 的开发人员来说,它们必须经常发生。
我已经阅读了this thread 和许多其他网站,但没有找到好的答案
我要求的是,在选择隐藏视图时,表现的差异是什么时候没有必要动画它们(我知道在改变时的性质的视觉效果的视觉效果方面的差异)
从实用的角度来看,只要您根本不想为任何东西设置动画,我觉得只设置 hidden 属性而不关心 alpha 会更聪明。另一方面,如果在性能上绝对没有差异,为什么要将属性添加到 UIView 类中?
在一些 cmets 和问题中,当 alpha
值为 0.0f
时,人们说 hidden
属性为真,但经过一些调试后我发现事实并非如此,它们似乎是完全分开的并且没有以任何逻辑方式连接
编辑
我想强调的是,我知道性能差异不会很大,但我仍然想知道,这是被问到的问题。 这与使用无关。这已在许多页面以及 *** 上得到处理。
【问题讨论】:
【参考方案1】:虽然我不能谈论性能差异(如果有的话,它一定会非常小)我想谈谈你的最后一点。
另一方面,如果在性能上绝对没有差异,为什么要在 UIView 类中添加属性?
如果它们被同等对待,那么可能只是为了使代码更清晰。如果您想隐藏一个视图,您会期望有一个“隐藏”属性,并且在阅读代码(或搜索大型代码库以查找隐藏视图)时,您会自然而然地寻找隐藏属性,而不是 alpha属性。
【讨论】:
很公平,我同意人们应该使用 hidden 但可悲的事实是大多数开发人员不这样做。我最近才开始使用hidden
而不是alpha
来隐藏视图,因为我根本不知道。查看自 ios 2.0 以来可用的文档,我们为什么不使用它?【参考方案2】:
与hidden
不同,alpha
是一个动画属性。基本上,这意味着您不是直接设置值,而是在调用 setAlpha:
时将动画添加到处理 alpha 更改的视图中。
这就是为什么以下事情并不总是有效的原因之一:
CGFloat alpha = 0.5f;
[view setAlpha:alpha];
CGFloat alpha2 = view.alpha; //not 0.5f!
这意味着将hidden
设置为NO
始终优于将alpha
设置为0.0
。尽管性能差异不会很明显,但设置alpha
仍然比仅使用hidden
复杂得多。
如果你想隐藏视图,使用hidden
,如果你想改变透明度(或动画),使用alpha
。
编辑:
许多程序员更喜欢使用alpha
而不是hidden
,这与您通常使用动画显示和隐藏视图这一事实有关。仅使用alpha
可以简化代码,因为您不必一次设置两个变量:
//showing a view
view.hidden = NO;
view.alpha = 0.0f;
[UIView animateWithDuration:0.3 animations: ^
view.alpha = 1.0f;
];
//hiding a view
[UIView animateWithDuration:0.3 animations: ^
view.alpha = 0.0f;
completion:^(BOOL finished)
view.alpha = 1.0f;
view.hidden = YES;
];
如果你忽略hidden
而只使用alpha
来隐藏视图,你可以简化上面的代码。
【讨论】:
不确定这是否真的回答了这个问题,我知道这一点,但想知道两者之间的性能和“最佳实践”只是为了隐藏一个视图 @Benzy 性能上的差异不会很明显。即使使用alpha
,动画也会立即生效(如果您不设置持续时间),并且当动画完成时,不会有任何区别,因为根本不会显示图层。我的回答中的最后一句话可以总结最佳实践。只需使用最简单的解决方案。
我知道单次执行的性能不会很明显。这仍然是我问的问题。感谢您的帮助!【参考方案3】:
请注意,比在 macOS 上,(alpha == 0) != (hidden == YES)
,所以可能有一些历史原因......
alpha 也是浮点数,这可能会有问题,因为只有一个状态 (0) 表示隐藏,但有很多状态表示可见(尤其是动画,如果值停留在 0.000001 上可能会出错),但是隐藏的很清楚
最好的方法是创建一个 UIView 子类,在 alpha == 0 上设置 hidden = YES
【讨论】:
以上是关于UIView 属性 hidden = YES vs alpha = 0.0f的主要内容,如果未能解决你的问题,请参考以下文章
在 Xamarin 中使用 transitionWithView 设置 UIView.Hidden 属性时淡化动画
iOS开发-之UIView属性hidden, opaque, alpha, opacity的区别