あなたは再利用する細胞のポイントを逃しています。あなたのコード:
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! MyTableViewCell
addStacksToTableCell(cell.stack1)
addStacksToTableCell(cell.stack2)
addStacksToTableCell(cell.stack3)
addStacksToTableCell(cell.stack4)
return cell
}
あなたはスクロールダウン毎回、新たなセルを使用して、その中にすべてのビュー(400ビュー)を削除すると、あなたは、新しいビュー(400ビュー)を作成している、高価なレイアウトをトリガーと仕組みを再レンダリング、表示されています。
あなたのスクロールのたびに発生します。
これは、細胞を再利用する目的を完全に無効にします。これは、毎回新しいセルを作成するのと同じです。
代わりに、ビューを1回作成してください。セルを再利用する場合は、内部ビューの色のみを更新してください。色を変更するだけでは、ビューを再作成しないでください。
は、あなたのセルに追加します:いくつかの非常に単純な変更を使用して
それは、この特定のケースに接続され、100%ではありません
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! MyTableViewCell
if !cell.createdViews {
cell.views1 = addStacksToTableCell(cell.stack1)
cell.views2 = addStacksToTableCell(cell.stack2)
cell.views3 = addStacksToTableCell(cell.stack3)
cell.views4 = addStacksToTableCell(cell.stack4)
cell.createdViews = true
} else {
// only update the views
cell.views1.forEach { $0.backgroundColor = UIColor.random() }
cell.views2.forEach { $0.backgroundColor = UIColor.random() }
cell.views3.forEach { $0.backgroundColor = UIColor.random() }
cell.views4.forEach { $0.backgroundColor = UIColor.random() }
}
return cell
}
func addStacksToTableCell(_ stack: UIStackView) -> [UIView] {
stack.removeAllArrangedSubviews()
var views: [UIView] = []
for i in 0..<ITEMS{
let image = UIImageView()
image.backgroundColor = UIColor.random()
stack.addArrangedSubview(image)
let width = NSLayoutConstraint(item: image, attribute: .width, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1, constant: 50)
let height = NSLayoutConstraint(item: image, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1, constant: 50)
image.addConstraints([width,height])
views.append(image)
}
return views
}
なぜこれを行うにはコレクションビューを使用できないのかと尋ねるのは公正でしょうか? – NRitH
このコードは、スクロールのパフォーマンスが低いことを示すために行われているためです。私の実際のプロジェクトでは、セルに項目が増えているので、UITableViewを使用する必要があります。 –