我是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),它仍然无法工作。 如果需要更多信息,请告诉我。
我在这里错过了什么吗?
非常感谢。答案 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
}