细胞重用问题迅速

时间:2017-08-03 13:24:47

标签: ios swift tableview

我有细胞的表视图。在我的单元格中,我有一个宽度等于0的初始约束视图。在CellForRow ..方法中,我更新了如下约束:

  filledAreaWidth = viewModel.percentageFilled * cellWIdthCalculated

            self.layoutIfNeeded()
            self.filledAreaView.snp.updateConstraints({ (make) in
                make.width.equalTo(self.filledAreaWidth)
            })

            UIView.animate(withDuration: 0.65, animations: {
                self.layoutIfNeeded()
            })

因此,它会改变宽度的变化,看起来像是从左到右的彩色条形图。

问题是,当我滚动表格时,它每次都会为它设置动画。我不想为已经创建的单元格设置动画,仅为新单元设置动画。

4 个答案:

答案 0 :(得分:2)

//Edit Add this before

  let shownIndexes:[IndexPath] = []


 if (![self.shownIndexes containsObject:indexPath]) {
 [self.shownIndexes addObject:indexPath];
            // Animation code
  }

在下面的委托方法中使用上面的方法,它会起作用。加载tableview时只加载一次动画。

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, 
forRowAt indexPath: IndexPath) {
 }

答案 1 :(得分:1)

检查区域是否已填满:

productID=1 ,shape=circular , diamterofCircle=5 , lengthofRect=0, widthofRect=0, L1ofTriangle=0, L2OfTriangle=0, L3OfTriangle=0

答案 2 :(得分:0)

保持已显示的单元格数,在行单元格中检查indexPath.row是否小于displayedCount。设displayCount始终是从-1开始显示的单元格的最大值。喜欢这个

var rowsDisplayed = -1
在cellForRow中

   if indexPath.row > rowsDisplayed {
          animate()
          rowsDisplayed = indexPath.row
}

答案 3 :(得分:0)

您可以在viewController中添加[Int:Bool]字典来处理已经设置动画的单元格,并在tableView中使用willDisplay方法检查并做出反应,如下所示

var animatedCells: [Int:Bool] = [:]

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
        if(animatedCells[indexPath.row] == nil)
          {
            animatedCells[indexPath.row] = true
            cell.makeYourAnimation()
          }
    }

您还需要将动画代码传递给单元格实现

希望这有帮助