UICollectionView 中的 ScrollToItemAt 不起作用

ScrollToItemAt in UICollectionView does not work

我使用故事板中的 UICollectionView 创建了一个水平菜单 (Swift)。将集合滚动到活动单元格时出现问题 - 滚动仅在不更新集合的情况下才能正常工作。我需要更新它以显示活动单元格(底部的文本颜色和线条隐藏在非活动单元格中)。问题的实质在附加到代码的动画中清晰可见。

如何解决问题并制作真正的工人菜单?

代码 1 滚动是正确的,单元格没有重新加载 gif-demonstration

//1
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {

  collectionMenu.isPagingEnabled = false
  collectionMenu.scrollToItem(at: indexPath, at: .centeredHorizontally, animated: true)
  collectionMenu.isPagingEnabled = true

}

代码 2 单元格已重新加载,但滚动已损坏 gif-demonstration

//2
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {

  collectionMenu.reloadData() //change design active cell
  collectionMenu.isPagingEnabled = false
    collectionMenu.scrollToItem(at: indexPath, at: .centeredHorizontally, animated: false)
    view.layoutIfNeeded()
    collectionMenu.scrollToItem(at: indexPath, at: .centeredHorizontally, animated: true)
  collectionMenu.isPagingEnabled = true

}

与其在 didSelectItem(at:) 上重新加载 collectionView,不如从那里手动更新单元格样式。我认为也不需要通过 didSelect 打开和关闭 collectionView 上的分页。

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    collectionMenu.scrollToItem(at: indexPath, at: .centeredHorizontally, animated: false)

    guard let cell = collectionView.cellForItem(at: indexPath) as? YourCell else { return }
    cell.titleLabel.text = // Your orange colour
}

您可能还需要像这样重写单元格内的 prepareForReuse 方法,以防止出队问题,例如在错误的时间显示文本颜色等。

class YourCell: UICollectionViewCell {

    override func prepareForReuse() {
        super.prepareForReuse()
        
        titleLabel.text = // Your default grey colour
    }

}