UIcollectionView scrollToitemAtIndexPath对非可见单元格

时间:2016-06-17 14:12:35

标签: ios swift uicollectionview uicollectionviewcell

我是iOS和Swift的新手。

设法使用自定义LayoutAttributes和可重复使用的自定义单元格创建UICollectionView,该单元格计算图像的高度。 这一切都很棒。工作正常,我可以手动滚动。好的。

问题是我想以编程方式滚动到第N个indexPath,但scrollToItemAtIndexPath似乎只适用于可见的。

所以我需要2列图像,在iphone 5S上显示9张图像。 图像总数为31。

因此,使用collectionView的ScrollToItemAtIndexPath可以处理第9项。

然而,当我尝试进一步以编程方式滚动时,比如12,它不起作用。 奇怪的是,如果手动滚动,然后调用代码,它的工作原理。 所以我调试了一下,看到只有前9个单元格的高度计算。 那会是问题吗?如果是这样,我怎么能让它运作?

尝试过使用didLayoutSubviews和其他人的建议,但它没有用。

目前,我正在使用didSelectItemAtIndexPath collectionView功能以编程方式滚动。

编辑:

override func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {
    let item = self.collectionView(self.collectionView!, numberOfItemsInSection: 0) - 1
            let lastItemIndex = NSIndexPath(forItem: item, inSection: 0)
            self.collectionView?.scrollToItemAtIndexPath(lastItemIndex, atScrollPosition: UICollectionViewScrollPosition.CenteredVertically, animated: true)
}

即使我硬编码索引路径的编号(例如12),它仍然无法工作。 如果需要更多信息,请告诉我。

我在这里错过了什么吗?

非常感谢。

3 个答案:

答案 0 :(得分:5)

你应该在viewDidAppear中调用方法scrollToItemAtIndexPath,这样就已经调用了cellForItemAtIndexPath。

override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)

    collectionView.scrollToItemAtIndexPath(NSIndexPath(forRow: index, inSection: 0), atScrollPosition: .CenteredVertically, animated: false)

}

答案 1 :(得分:0)

我最初对Lilo的回答表示赞同,但我注意到将代码添加到viewDidAppear会导致我的水平collectionView突然滚动/动画化到我希望滚动到的索引。

正确的做法is from this answer

在viewWillAppear中,在调用1. #include <stdio.h> int squr(int n, int j){ if(j == 0) return 0; else if(j > 0) return(n + squr(n, j - 1)); else if (n < 0) return(n + squr(n, j - 1)); } void loop(int* arr, int count){ for(int n = 0; n < count; n++) arr[n] = squr(arr[n], arr[n]); } 2. void squr(int* arr, int N){ for(int i = 0; i < N; i++){ for(int j = 0; j < i; j++) sum += i; arr[i] = sum; sum = 0; } } 之前,请调用collectionView.scrollToItem,并且场景出现时不会出现突然的视觉滚动。

view.layoutIfNeeded()

答案 2 :(得分:0)

当我尝试滚动到不可见的单元格并在 indexPath 处获取该单元格时,这对我有所帮助:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    
    collectionView.scrollToItem(at: indexPath, at: .centeredVertically, animated: false)
    view.layoutIfNeeded()
    // here you can get a cell
}