我有一个UICollectionView
有142个单元格。任何时候都可以看到7.5。
我将一个单元格从indexPath
0移动到100。
但我也想滚动到那个新职位。
以下代码运行正常。但它动画移动和滚动,但随后将细胞加载到中央/移动的细胞前后。 我认为这是因为细胞是可重复使用的。但是142,我无法预加载所有这些
它不是最好的效果,我想预先加载新位置周围的单元格,在indexPath
100之前4和之后4,然后看到移动和滚动的动画。你能帮忙吗?
UIView.animateWithDuration(animationSpeed, animations: {() -> Void in
self.collectionView.layoutIfNeeded()
self.collectionView.scrollToItemAtIndexPath(NSIndexPath(forItem:self.indexPathSelected.row,
inSection:0),
atScrollPosition: .CenteredHorizontally,
animated: true)
})
答案 0 :(得分:18)
Swift 3.0或更新
在实现scrollToItem方法之前添加“view.layoutIfNeeded()”,理想情况下在viewWillAppear中
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
view.layoutIfNeeded()
colView.scrollToItem(at: IndexPath(item: 4, section: 0), at: .centeredHorizontally, animated: true)}
答案 1 :(得分:7)
我使用dispatch_async来更新UI并且它可以正常工作。
let numberOfSections = self.collectionView.numberOfSections()
let numberOfRows = self.collectionView.numberOfItemsInSection(numberOfSections-1)
if numberOfRows > 0 {
dispatch_async(dispatch_get_main_queue(), {
let indexPath = NSIndexPath(forRow: numberOfRows-1, inSection: (numberOfSections-1))
self.collectionView.scrollToItemAtIndexPath(indexPath, atScrollPosition: .Bottom, animated: true)
})
}
答案 2 :(得分:0)
我找到的唯一答案是为动画添加几秒钟。这样滚动到达时就会加载单元格
答案 3 :(得分:0)
我发现最好的解决方案是使用DispatchQueue
。
Swift 4.2:
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
if let index = items.firstIndex(of: preSelectedItem) {
DispatchQueue.main.async {
self.collectionView.scrollToItem(at: IndexPath(item: index, section: 0), at: .top, animated: false)
}
}
}
答案 4 :(得分:0)
@Politta的答案是正确的。这是在目标C中实现所需功能的方法:
- (void)scrollToBottomWithoutAnimation{
NSInteger lastVisibleRowIndex = (NSInteger)self.myItems.count - 1;
NSIndexPath *lastVisibleIndexPath = [NSIndexPath indexPathForRow: lastVisibleRowIndex inSection:0];
[self.collectionView scrollToItemAtIndexPath:lastVisibleIndexPath atScrollPosition: UICollectionViewScrollPositionCenteredVertically animated:NO];
}
在您的viewWillAppear方法中:
dispatch_async(dispatch_get_main_queue(), ^{
[self scrollToBottomWithoutAnimation];
});