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
}
}
我使用故事板中的 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
}
}