3

我有一个UICollectionView142 个单元格。7.5 随时可见。

我正在将一个单元格从indexPath0 移动到 100。但我也想滚动到那个新位置。

下面的代码工作正常。但它会为移动和滚动设置动画,但随后会加载中央/移动单元格前后的单元格。我认为这是因为细胞是可重复使用的。但是有 142 个,我无法预加载所有这些

这不是最好的效果,我想预加载新位置周围的单元格,100之前的4indexPath个和100之后的4个,然后看看移动和滚动的动画。你能帮忙吗?

UIView.animateWithDuration(animationSpeed, animations: {() -> Void in
    self.collectionView.layoutIfNeeded()
    self.collectionView.scrollToItemAtIndexPath(NSIndexPath(forItem:self.indexPathSelected.row, 
                                                 inSection:0), 
                                                 atScrollPosition: .CenteredHorizontally, 
                                                 animated: true)

})
4

6 回答 6

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)}
于 2017-02-21T11:30:06.740 回答
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)
        })
    }
于 2016-04-25T05:44:25.280 回答
0

我找到的唯一答案是在动画中添加几秒钟。这样当滚动到达时会加载单元格

于 2016-01-13T16:58:57.657 回答
0

您需要先打电话[self.view layoutIfNeeded]再打电话scrollToBottomWithoutAnimation

于 2021-09-07T14:32:01.047 回答
0

我发现的最佳解决方案是使用DispatchQueue.

斯威夫特 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)
        }
    }
}
于 2018-11-06T21:37:53.890 回答
0

@Politta 的回答是正确的。下面是如何在 Objective 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];
}

​</p>

在您的 viewWillAppear 方法中:

dispatch_async(dispatch_get_main_queue(), ^{
    [self scrollToBottomWithoutAnimation];
});
于 2020-08-31T08:46:56.743 回答