UIView 添加/删除子视图与隐藏/显示的速度

Posted

技术标签:

【中文标题】UIView 添加/删除子视图与隐藏/显示的速度【英文标题】:speed of UIView add/remove subview versus hiding/showing 【发布时间】:2014-02-24 16:57:56 【问题描述】:

假设我有一个全屏UIView,它在触摸按钮时覆盖主屏幕,然后在触摸此覆盖视图时消失。这个UIView可以使用addSubview:removeFromSuperview从当前视图中添加和删除,或者可以在当前视图初始化时添加,然后通过访问和设置hidden属性来显示和隐藏UIView。哪个通常更快更好的性能(或者它们是相同的)?

【问题讨论】:

【参考方案1】:

我确实尝试添加 imageView 并尝试循环 1000000 次以在每个循环中隐藏和显示并在每个循环中添加删除。结果是隐藏和显示需要 1 秒来执行 1000000 循环。并添加删除需要 3 秒。我在模拟器里做的:)

【讨论】:

【参考方案2】:

我打赌显示和隐藏会更快。另一种方式需要创建/销毁对象,以及摆弄子视图。

更重要的是,我认为展示和隐藏会更简单,与复杂性作斗争是最重要的。

【讨论】:

我同意它看起来更复杂,但它真的是对象创建/销毁吗?如果我创建叠加层,在超级视图上附加一个指向它的指针,然后根据需要简单地从视图中添加/删除它,这不只是一个指针交换吗?我只使用了一次 alloc/init。 好的,但是很难看到任何好处。无论如何,隐藏的子视图在合成中都会被忽略。对我来说似乎是过早的优化(参见en.wikipedia.org/wiki/Program_optimization)。【参考方案3】:

正如 Clay 所说,显示隐藏可能会更快,但您需要灵敏的仪器来检测差异。它最多将是个位数的百分之一秒,而且可能远低于此。您将无法“通过肉眼”感知差异。

因此重要的是其他事情,比如最容易理解和维护的事情是什么?使视图存在于视图控制器中并很好地显示/隐藏它的一个问题是视图的布局覆盖了视图控制器的其他内容并且难以管理。

您可以创建第二个 XIB(或与故事板一起使用的 XIB),将您的视图控制器的类作为“文件的所有者”,并将 IBOutlets 链接到您想要的视图。然后在需要时从 XIB 加载视图,将其安装为当前视图的子视图。然后在完成后将其从超级视图中删除。我相当多地使用这种方法。

【讨论】:

以上是关于UIView 添加/删除子视图与隐藏/显示的速度的主要内容,如果未能解决你的问题,请参考以下文章

UIView 越界时隐藏子视图

如何在 iOS 屏幕上点击某个区域时隐藏 UIView 并使其显示

UIView:将 UIViewController 的视图添加为子视图并将其删除

UIView 子视图不平滑动画

为啥从自定义 UIView 向 UIButton 添加子视图不显示添加的子视图?

UIPickerView 在 UIView 中不显示添加的子视图