UITableViewCell 中嵌套的 UIStackViews,会减慢滚动速度,降低性能。如何提高性能?

Posted

技术标签:

【中文标题】UITableViewCell 中嵌套的 UIStackViews,会减慢滚动速度,降低性能。如何提高性能?【英文标题】:Nested UIStackViews in UITableViewCell, slows down the scrolling, reduce performance. How do I improve performance? 【发布时间】:2016-08-03 12:02:47 【问题描述】:

我在我的UITableViewCell 中使用嵌套的UIStackViews。但是,当我滚动时它非常慢并且极大地影响了性能。有什么方法可以提高UITableViewCell 中嵌套UIStackViews 的性能?

这就是我将堆栈添加到我的UITableViewCell 的方式:

    let verticalStack = UIStackView()
    verticalStack.axis = .Vertical

    for i in 0..<json["Rows"].arrayValue.count

        let horizontalStack = UIStackView()
        horizontalStack.axis = .Horizontal

        for j in 0..<json["Rows"][i]["Column"].arrayValue.count
            let label = UILabel()
            label.text = "Test"
            horizontalStack.addArrangedSubview(label)
        

        verticalStack.addArrangedSubview(horizontalStack)
    


    cell.addSubview(verticalStack)

【问题讨论】:

你是如何创建单元格的?尝试异步填充单元格 异步填充单元格?它是如何工作的? 您可以考虑“分析应用程序”。按住 Xcode 中的运行按钮以启动分析器。选择时间分析器,然后记录应用程序,看看哪些代码行很慢。 堆栈视图只计算其排列的子视图的布局约束,因此它们本身不应该影响性能。另一方面,如果您非常频繁地运行上面的代码,您可能会因此而变慢。这段代码什么时候执行?多久一次? 【参考方案1】:

问题是,您在出队时分配了多个 UILabel。因此,每次滚动时,都会创建新标签。 通常,您不应该在cellForRowAtIndexPath 中执行高性能操作(如分配)。 更好的方法是一次性创建所有标签并重复使用它们。 如果你有固定数量的标签,你可以直接将它们作为排列好的子视图添加到 XIB 文件中(或最初在单元类中),这样它们将被重用。

【讨论】:

以上是关于UITableViewCell 中嵌套的 UIStackViews,会减慢滚动速度,降低性能。如何提高性能?的主要内容,如果未能解决你的问题,请参考以下文章

UITableViewCell中嵌套UICollectionView

FetchedResultsController 并在一个 UITableViewCell 中显示来自 3 个嵌套实体的数据

UITableViewCell嵌套UICollectionView滑动错乱问题

UITableViewCell嵌套UIWebView并且cell根据webView的内容自适应

UITableViewCell嵌套UITableView的正确姿势

UIButton 移动到自定义单元格中的情节提要