UICollectionView rollToItem 在 iOS 14 中不起作用

问题描述 投票:0回答:5

我正在使用集合视图 UICollectionView,它工作得非常好......除了我无法滚动到任何特定项目。我最好的猜测似乎总是滚动到“中间”。无论如何,我发送给scrollToItem的任何内容似乎对滚动都没有影响。我已将它放在整个视图控制器的各个位置,但没有成功。

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    let lastIndex = IndexPath(row: messages.count-1, section: 0)
    self.messagesView.scrollToItem(at: lastIndex, at: .bottom, animated: true)
}
ios swift uiviewcontroller
5个回答
41
投票

UICollection View 在 iOS 14 中存在 scrollToItem 的错误。在 iOS 14 中,只有在集合视图分页被禁用的情况下,它才会起作用。 因此,如果我们必须手动和编程方式滚动,我得到了一个解决方案。

特别适用于iOS 14及以上版本

  self.collView.isPagingEnabled = false
  self.collView.scrollToItem(at: IndexPath(item: scrollingIndex, section: 0), at: .left, animated: true)
  self.collView.isPagingEnabled = true

11
投票

您可以尝试将滚动代码放入

viewDidLayoutSubviews
中,该代码应该在加载所有表格单元格后调用,这意味着您的 messages.count 应该可以工作。另外,请确保您的集合视图中只有一个部分。

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    self.scrollToBottom()
}

func scrollToBottom() {
    DispatchQueue.main.async {
        let lastIndex = IndexPath(item: messages.count-1, section: 0)
        self.messagesView.scrollToItem(at: lastIndex, at: .bottom, animated: true)
    }
}

1
投票

Swift 5 / iOS 15

我面临着同样的问题,所以我尝试了这一行代码并完成了它。

// here we slect the required cell instead of directly scrolling to the item and both work same. 

self.collectionView.selectItem(at: IndexPath(row: self.index, section: 0), animated: true, scrollPosition: .left)


0
投票

这对我有用,如果您想启用分页:

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    collectionView.isPagingEnabled = false
    collectionView.scrollToItem(
        at: IndexPath(item: 1, section: 0),
        at: .centeredVertically,
        animated: false
    )
    collectionView.isPagingEnabled = true
}

-1
投票

使用时

CompositionalLayout
请勿同时设置

collectionView.isPagingEnabled = true

设置您的收藏并且

let section = NSCollectionLayoutSection(group: group)
section.orthogonalScrollingBehavior = .paging

在 UICollectionViewCompositionalLayout 设置中。

UICollectionViewCompositionalLayout
中设置第二个。

© www.soinside.com 2019 - 2024. All rights reserved.