CollectionView 单元格在选中时移动
CollectionView Cell Moving when Selected
我有一个 CollectionView 问题,a video 显示了下面详细说明的问题。当我单击一个单元格时,它会以一种奇怪的方式移动。
这是我的代码:
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
selectedFilter = indexPath.row
if filters[indexPath.row] != "Todo" {
filteredNews = news.filter { [=10=].category == filters[indexPath.row] }
} else {
filteredNews = news
}
tableView.reloadData()
collectionView.reloadData()
}
我的手机在移动,(就是最后一个手机,不知道为什么)。
我认为这可能与 collectionView.reloadData() 有关,但我需要这样做来更新绿色条,当我 select 一个单元格时,你可以看到 on this Video。
怎样才能让它不动呢?有人遇到过类似的问题吗?
我注意到您在 collectionView didSelectItemAt 期间重新加载了一个 tableView。如果该 tableView 是您的 collectionView 的超级视图,那将是您出现这种异常行为的确切原因。
如果不是,我可以提供 3 种解决方案:
- This library 有一个视图控制器子类,可以创建你想要显示的效果。
- 手动创建一个不在 collectionView 内的 UIView/UIImageView,但在 collectionView 的 didSelectItemAt 委托方法期间更新它的位置,而是在单元格上可视化 - 这需要一些计算,但您的 collectionView 不需要重新加载。
- 您可以尝试使用 collectionView 的 reloadItem(at: IndexPath) 方法仅重新加载两个受影响的单元格。
知道当您重新加载一个 table/collection 视图时,它不会改变当前可见的单元格。但是,每个单元格中的任何内容都会受到影响。
我终于解决了!我删除了 collectionView.reloadData() 并添加了我的代码以更改 didSelectItemAt 中的颜色更改当前选定的项目和旧的选定项目(我创建了一个变量来查看哪个是旧的选定项目)。
如果有人感兴趣,这是我的代码:
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
let oldSelectedFilter = selectedFilter
if selectedFilter != indexPath.row {
let oldIndexPath = IndexPath(item: oldSelectedFilter, section: 0)
selectedFilter = indexPath.row
if filters[indexPath.row] != "Todo" {
filteredNews = news.filter { [=10=].category == filters[indexPath.row] }
} else {
filteredNews = news
}
if let cell = collectionView.cellForItem(at: indexPath) as? FiltersCollectionViewCell {
cell.selectedView.backgroundColor = MainColor
}
if let cell = collectionView.cellForItem(at: oldIndexPath) as? FiltersCollectionViewCell {
cell.selectedView.backgroundColor = UIColor(red:0.31, green:0.33, blue:0.35, alpha:1.0)
}
tableView.reloadData()
}
}
我有一个 CollectionView 问题,a video 显示了下面详细说明的问题。当我单击一个单元格时,它会以一种奇怪的方式移动。 这是我的代码:
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
selectedFilter = indexPath.row
if filters[indexPath.row] != "Todo" {
filteredNews = news.filter { [=10=].category == filters[indexPath.row] }
} else {
filteredNews = news
}
tableView.reloadData()
collectionView.reloadData()
}
我的手机在移动,(就是最后一个手机,不知道为什么)。
我认为这可能与 collectionView.reloadData() 有关,但我需要这样做来更新绿色条,当我 select 一个单元格时,你可以看到 on this Video。
怎样才能让它不动呢?有人遇到过类似的问题吗?
我注意到您在 collectionView didSelectItemAt 期间重新加载了一个 tableView。如果该 tableView 是您的 collectionView 的超级视图,那将是您出现这种异常行为的确切原因。
如果不是,我可以提供 3 种解决方案:
- This library 有一个视图控制器子类,可以创建你想要显示的效果。
- 手动创建一个不在 collectionView 内的 UIView/UIImageView,但在 collectionView 的 didSelectItemAt 委托方法期间更新它的位置,而是在单元格上可视化 - 这需要一些计算,但您的 collectionView 不需要重新加载。
- 您可以尝试使用 collectionView 的 reloadItem(at: IndexPath) 方法仅重新加载两个受影响的单元格。
知道当您重新加载一个 table/collection 视图时,它不会改变当前可见的单元格。但是,每个单元格中的任何内容都会受到影响。
我终于解决了!我删除了 collectionView.reloadData() 并添加了我的代码以更改 didSelectItemAt 中的颜色更改当前选定的项目和旧的选定项目(我创建了一个变量来查看哪个是旧的选定项目)。
如果有人感兴趣,这是我的代码:
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
let oldSelectedFilter = selectedFilter
if selectedFilter != indexPath.row {
let oldIndexPath = IndexPath(item: oldSelectedFilter, section: 0)
selectedFilter = indexPath.row
if filters[indexPath.row] != "Todo" {
filteredNews = news.filter { [=10=].category == filters[indexPath.row] }
} else {
filteredNews = news
}
if let cell = collectionView.cellForItem(at: indexPath) as? FiltersCollectionViewCell {
cell.selectedView.backgroundColor = MainColor
}
if let cell = collectionView.cellForItem(at: oldIndexPath) as? FiltersCollectionViewCell {
cell.selectedView.backgroundColor = UIColor(red:0.31, green:0.33, blue:0.35, alpha:1.0)
}
tableView.reloadData()
}
}