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的区别

.hidden = YES 工作,但 .hidden = NO 不工作

iOS - 隐藏的UIView的屏幕截图

UIView在点击问题上显示和隐藏[关闭]

UIView 的 viewDidLoad?