【问题标题】:UIView properties hidden = YES vs alpha = 0.0fUIView 属性 hidden = YES vs alpha = 0.0f
【发布时间】:2015-04-28 12:42:27
【问题描述】:

我一直在寻找这些案例的答案和一种“最佳实践”,因为对于任何试图处理 UI 和 UIKit 的开发人员来说,它们必须经常发生。

我已经阅读了this thread 和许多其他网站,但没有找到好的答案

我要求的是,在选择隐藏视图时,表现的差异是什么时候没有必要动画它们(我知道在改变时的性质的视觉效果的视觉效果方面的差异)

从实用的角度来看,只要您根本不想为任何东西设置动画,我觉得只设置 hidden 属性而不关心 alpha 会更聪明。另一方面,如果在性能上绝对没有差异,为什么要将属性添加到 UIView 类中?

在一些 cmets 和问题中,当 alpha 值为 0.0f 时,人们说 hidden 属性为真,但经过一些调试后我发现事实并非如此,它们似乎是完全分开的并且没有以任何逻辑方式连接

编辑

我想强调的是,我知道性能差异不会很大,但我仍然想知道,这是被问到的问题。 这与使用无关。这已在许多页面以及 stackoverflow 上得到处理。

【问题讨论】:

    标签: ios uiview uikit


    【解决方案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

    【讨论】:

      猜你喜欢
      • 2012-06-10
      • 1970-01-01
      • 2012-07-25
      • 1970-01-01
      • 2012-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-03
      相关资源
      最近更新 更多