2017-08-03 84 views
1

我有單元格的表格視圖。在我的小區i具有考慮到與寬度相等的初始約束爲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() 
      }) 

所以,動畫寬度發生變化,它看起來像着色條從圖紙左到右。

問題是,當我滾動表格時,它每次都進行動畫處理。我不想爲已經創建的單元格創建動畫,只爲新單元格創建單元格。

+0

@ the4kman是又怎樣?當我向他們滾動時,我再次獲得動畫效果。 –

+1

@ the4kman這不是真的。單元格被重用,而不是*新創建*,但是在'cellForRow'中,所有的操作都被再次調用。 – vadian

+0

@vadian是的,即時通訊談論什麼..不知何故,如果細胞已經顯示在屏幕上,我需要調用更新約束沒有動畫。 –

回答

0

您可以添加[Int:Bool]字典在你的viewController來處理這些細胞是動畫已經和的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() 
      } 
    } 

您還需要將您的動畫代碼傳遞給您的單元格實施

希望這有助於

+0

@EvgeniyKleban我看到你的動畫代碼在你的cellForRow中,我建議你將這段代碼傳遞給你的單元實現,爲了做到這一點,讓我知道如果你需要進一步的幫助 –

+0

@Reiner Melian,好,先試試你的解決方案 –

0

維持已顯示的單元格的數量,在單元格中檢查indexPath.row是否小於displayedCount。讓displayedCount始終是從-1開始顯示的單元格的最大值。像這樣

var rowsDisplayed = -1 
在cellForRow

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

我不使用這種方法,甚至不使用storyboard來創建單元格。 –

+0

awakeFromNib在單元重用的情況下被調用嗎?它不,所以解決方案不會工作。 –

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

檢查區域已經填滿與否:

filledAreaWidth = viewModel.percentageFilled * cellWIdthCalculated 
if filledAreaWidth != self.filledAreaView.frame.size.width { 

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

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