CollectionView 单元格顺序在滚动时混乱
CollectionView Cell order messes up on scroll
我正在尝试像这样改变我的集合视图单元格的颜色:
但是当我向下滚动然后向上滚动时,所有单元格都会像这样重新排序:
这是我的代码:
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return 100
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "yearlyBookshelfCell", for: indexPath) as! yearlyBookshelfCell
cell.bookLabel.text = "\(indexPath.item)"
if indexPath.item % 2 != 0 {
cell.bookView.backgroundColor = .darkGray
}
return cell
}
func numberOfSections(in collectionView: UICollectionView) -> Int {
return 1
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
let width = (view.frame.width)
return CGSize(width: view.frame.width/11, height: view.frame.width/3)
}
这是新 iOS 开发人员和 table views/collection 视图的常见问题。
规则:当您在 cellForItemAt/cellForRowAt 方法中 return 一个单元格时,您始终需要完全配置该单元格。不要假设它是空白页。
您的 if 语句说 if indexPath.item % 2 != 0
(如果项目计数是偶数)然后将背景颜色设置为灰色。
物品价值为奇数怎么办?你保留它开始时的任何颜色。我猜您的单元格以蓝色背景色开始。但是,如果这是上次使用时呈灰色的回收电池怎么办?
按照您编写代码的方式,该单元格将通过 if 语句,并且其(灰色)背景颜色不会改变..
你需要一个 else 子句:
if indexPath.item % 2 != 0 {
cell.bookView.backgroundColor = .darkGray
} else {
cell.bookView.backgroundColor = .blue // Or whatever the default color is
}
并且您需要为可能会更改的每个 属性 单元格执行此操作。如果每 100 个单元格周围都有一个盒子,那么如果它不是 100 个单元格中罕见的 1 个之一,则您需要编写删除该盒子的代码,否则您最终会从上次使用的时间。
我正在尝试像这样改变我的集合视图单元格的颜色:
但是当我向下滚动然后向上滚动时,所有单元格都会像这样重新排序:
这是我的代码:
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return 100
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "yearlyBookshelfCell", for: indexPath) as! yearlyBookshelfCell
cell.bookLabel.text = "\(indexPath.item)"
if indexPath.item % 2 != 0 {
cell.bookView.backgroundColor = .darkGray
}
return cell
}
func numberOfSections(in collectionView: UICollectionView) -> Int {
return 1
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
let width = (view.frame.width)
return CGSize(width: view.frame.width/11, height: view.frame.width/3)
}
这是新 iOS 开发人员和 table views/collection 视图的常见问题。
规则:当您在 cellForItemAt/cellForRowAt 方法中 return 一个单元格时,您始终需要完全配置该单元格。不要假设它是空白页。
您的 if 语句说 if indexPath.item % 2 != 0
(如果项目计数是偶数)然后将背景颜色设置为灰色。
物品价值为奇数怎么办?你保留它开始时的任何颜色。我猜您的单元格以蓝色背景色开始。但是,如果这是上次使用时呈灰色的回收电池怎么办?
按照您编写代码的方式,该单元格将通过 if 语句,并且其(灰色)背景颜色不会改变..
你需要一个 else 子句:
if indexPath.item % 2 != 0 {
cell.bookView.backgroundColor = .darkGray
} else {
cell.bookView.backgroundColor = .blue // Or whatever the default color is
}
并且您需要为可能会更改的每个 属性 单元格执行此操作。如果每 100 个单元格周围都有一个盒子,那么如果它不是 100 个单元格中罕见的 1 个之一,则您需要编写删除该盒子的代码,否则您最终会从上次使用的时间。