CollectionView单元格在选中时移动

时间:2016-12-14 21:54:50

标签: ios swift swift3 uicollectionviewcell collectionview

我有一个CollectionView问题,我a video显示了下面详述的问题。当我点击一个单元格时,它以奇怪的方式移动。 这是我的代码:

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    selectedFilter = indexPath.row

    if filters[indexPath.row] != "Todo" {
        filteredNews = news.filter { $0.category == filters[indexPath.row] }
    } else {
        filteredNews = news
    }
    tableView.reloadData()
    collectionView.reloadData()

}

My Cell正在移动,(只是最后一个细胞,不知道为什么)。

我认为它可能与collectionView.reloadData()有关但是当我选择一个Cell时,我需要更新绿色栏,你可以看到on this Video

我怎么能让它不动?有人有类似的问题吗?

2 个答案:

答案 0 :(得分:1)

我注意到你在collectionView didSelectItemAt期间重新加载了一个tableView。如果那个tableView是你的collectionView的superView,那将是你出现这种异常行为的确切原因。

如果不是,我可以提供3种解决方案:

  1. This library有一个视图控制器子类,可以创建您想要显示的效果。
  2. 手动创建一个不在collectionView内部的UIView / UIImageView,但是在collectionView的didSelectItemAt委托方法中更新它的位置,但在视觉上在单元格上改为 - 这需要一些计算,但是你的collectionView不需要重装。
  3. 您可以尝试仅使用collectionView的reloadItem(at:IndexPath)方法重新加载两个受影响的单元格。
  4. 了解当您重新加载表/集合视图时,它不会更改当前的可见单元格。但是,每个单元格中的任何内容都会受到影响。

答案 1 :(得分:0)

最后我解决了!我删除了collectionView.reloadData()并添加了我的代码以更改didSelectItem内的颜色更改当前所选项目和旧选定项目(我创建了一个变量以查看哪个是旧选定项目。)

如果有人有兴趣,这是我的代码:

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 { $0.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()
    }
}