优化向 UIStackView 添加视图
Posted
技术标签:
【中文标题】优化向 UIStackView 添加视图【英文标题】:Optimizing adding views to a UIStackView 【发布时间】:2019-12-03 19:08:34 【问题描述】:我在滚动视图中有多个 UIStackViews
。加载视图时,每个堆栈视图(例如 6 个)都填充了大约 8 个视图。这意味着在表格视图单元格点击时,将初始化 48 个视图并平等地添加到 6 个堆栈视图之一。可以想象,点击表格视图单元格加载堆栈视图时会有 0.5 - 1 秒的延迟。在 ios 应用中,这绝对是一种慢下来的感觉。
简化我的代码如下所示:
for (index, stackView) in stackViews.enumerated()
for view in views[index]
stackView.addArrangedSubview(view)
我已经考虑了这些选项:
在堆栈视图进出视图时添加/删除它们,尽管在 iPad 上无论如何都可以看到所有堆栈视图。 多线程,虽然我不确定这是否可行,因为所有 UI 代码都需要在主线程上运行。 只需使用draw
,因为堆栈视图中的视图在外观上大多相似。
这些值得去做吗?还有其他我没有考虑过的选择吗?
【问题讨论】:
为什么不选择 CollectionView? 你能多介绍一下你在做什么吗?我刚刚做了一个快速测试,将 8 个UILabel
s 添加到 6 个UIStackView
s 中的每一个(因此,总共 48 个标签),它们几乎立即出现......0.0299...
秒。
@DonMag 还有其他容器视图,堆栈视图位于内部以便对其进行样式设置(例如圆角、阴影)。你的结果让我觉得这些也可能导致减速。为了调试,您使用什么工具来确定交互之间的时间?
@mac38478 - 是的,这肯定是个问题。比较循环前后的CFAbsoluteTimeGetCurrent()
,我得到了不到 0.03 秒...使用 Instruments -> Time Profiler,循环在它自己的函数中(尝试让它尽可能接近),我看到 16.00 毫秒。
@mac38478 - 这是我快速测试的示例代码:pastebin.com/TNAjWc3L
【参考方案1】:
选择选项 (2)。正如here 所提到的,在主线程之外准备视图是可以的。如果这些观点足够相似,我肯定会事先准备好并在某处设置一个pool。此外,检查任何数据处理影响:您是否显示任何图像或其他任何内容? (这在给定的代码中看不到,如果需要,请提供更多)。
【讨论】:
我只是在改变一个标签值和视图的背景颜色,即使添加几十个普通的 UIViews 也会导致速度变慢。经过测试,看起来我只能从主线程初始化一个 UIView,所以看起来多线程可能是不可能的。以上是关于优化向 UIStackView 添加视图的主要内容,如果未能解决你的问题,请参考以下文章
如何使用内部 XIB 为动态 UIStackView 设置对齐方式