优化向 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 个UILabels 添加到 6 个UIStackViews 中的每一个(因此,总共 48 个标签),它们几乎立即出现......0.0299... 秒。 @DonMag 还有其他容器视图,堆栈视图位于内部以便对其进行样式设置(例如圆角、阴影)。你的结果让我觉得这些也可能导致减速。为了调试,您使用什么工具来确定交互之间的时间? @mac38478 - 是的,这肯定是个问题。比较循环前后的CFAbsoluteTimeGetCurrent(),我得到了不到 0.03 秒...使用 Instruments -> Time Profiler,循环在它自己的函数中(尝试让它尽可能接近),我看到 16.00 毫秒。 @mac38478 - 这是我快速测试的示例代码:pastebin.com/TNAjWc3L 【参考方案1】:

选择选项 (2)。正如here 所提到的,在主线程之外准备视图是可以的。如果这些观点足够相似,我肯定会事先准备好并在某处设置一个pool。此外,检查任何数据处理影响:您是否显示任何图像或其他任何内容? (这在给定的代码中看不到,如果需要,请提供更多)。

【讨论】:

我只是在改变一个标签值和视图的背景颜色,即使添加几十个普通的 UIViews 也会导致速度变慢。经过测试,看起来我只能从主线程初始化一个 UIView,所以看起来多线程可能是不可能的。

以上是关于优化向 UIStackView 添加视图的主要内容,如果未能解决你的问题,请参考以下文章

UIStackView 中的图像未四舍五入

如何使用内部 XIB 为动态 UIStackView 设置对齐方式

基于模板创建自定义视图

将视图动态添加到 UIStackview

如何向放置在 UIStackView 中的以编程方式创建的 UIButton 添加约束

隐藏内部视图时,UIStackView 将内容向左移动