【发布时间】:2012-07-04 22:37:21
【问题描述】:
这个问题真的很基础。从视图层次结构中删除 UIView 和隐藏 UIView 之间的性能差异是什么?
我已经读到应该从视图层次结构中删除不需要的视图。我目前的情况是 UIButton 有时应该是可见的。我什么时候隐藏UIButton,什么时候从它的超级视图中删除它?
更改视图层次结构是否昂贵?
【问题讨论】:
这个问题真的很基础。从视图层次结构中删除 UIView 和隐藏 UIView 之间的性能差异是什么?
我已经读到应该从视图层次结构中删除不需要的视图。我目前的情况是 UIButton 有时应该是可见的。我什么时候隐藏UIButton,什么时候从它的超级视图中删除它?
更改视图层次结构是否昂贵?
【问题讨论】:
最初的问题和(正确)接受的答案之间已经过去了几年。让我补充另一个因素:与此同时,Apple 引入了 AutoLayout,正如有人所说,它可能会在某些(深层)子视图层次结构中带来相当大的性能损失。
如果您使用 AutoLayout,则隐藏的视图仍会进行布局,而不是已删除的视图(其引用保存在某处)。根据您的情况,这可能会产生性能差异。
【讨论】:
我在 iOS6 iPad mini 上做了一个实验,有一个大滚动视图,里面有很多丰富的内容(包括图像、阴影、渐变层、带图案的背景图像,你知道的,那些设计师:))和我发现view.hidden=YES≠[view removeFromSuperview]。
我原本以为将 hidden 设置为 YES 会使视图不被渲染/绘制,因此隐藏的视图很多不会影响效率。但实际结果是: 1)如果我将大滚动视图中的屏幕外视图设置为隐藏(并在它们返回可见区域时取消隐藏它们),滚动根本不平滑/连续。当它自然减速时,它看起来非常跳跃。 2)如果我从滚动视图中删除屏幕外视图(但仍然通过跟踪数组保留在内存中,因此当它们返回时可以立即添加),滚动显然更平滑。
【讨论】:
如果您需要在显示和隐藏子视图之间交替显示,最好的方法肯定是隐藏它。对于UIButton,内存影响无论如何都不是那么好。如果只是切换hidden 属性,代码肯定会更简单。
此外,您还可以获得hidden 属性是可动画的额外优势!
【讨论】: