ios - 动画 UICollectionView contentOffset 不显示不可见的单元格

标签 ios animation uicollectionview contentoffset

我正在研究一些类似代码的功能,并且正在使用 UICollectionView。它最初是一个 scrollView,但我们认为 collectionView 将使添加/删除单元格变得更容易。

我正在使用以下内容为 collectionView 设置动画:

- (void)beginAnimation {
    [UIView animateWithDuration:((self.collectionView.collectionViewLayout.collectionViewContentSize.width - self.collectionView.contentOffset.x) / 75) delay:0 options:(UIViewAnimationOptionCurveLinear | UIViewAnimationOptionRepeat | UIViewAnimationOptionBeginFromCurrentState) animations:^{
        self.collectionView.contentOffset = CGPointMake(self.collectionView.collectionViewLayout.collectionViewContentSize.width, 0);
    } completion:nil];
}

这对 ScrollView 来说效果很好,而动画是在 Collection View 上发生的。但是,实际上只有动画结束时可见的单元格才会被渲染。调整 contentOffset 不会导致调用 cellForItemAtIndexPath。如何在 contentOffset 更改时让单元格呈现?

编辑: 更多引用(不确定是否有帮助):

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
    TickerElementCell *cell = (TickerElementCell *)[collectionView dequeueReusableCellWithReuseIdentifier:@"TickerElementCell" forIndexPath:indexPath];
    cell.ticker = [self.fetchedResultsController objectAtIndexPath:indexPath];
    return cell;
}

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller {

    // ...

    [self loadTicker];
}

- (void)loadTicker {

    // ...

    if (self.animating) {
        [self updateAnimation];
    }
    else {
        [self beginAnimation];
    }
}

- (void)beginAnimation {

    if (self.animating) {
        [self endAnimation];
    }

    if ([self.tickerElements count] && !self.animating && !self.paused) {
        self.animating = YES;
        self.collectionView.contentOffset = CGPointMake(1, 0);
        [UIView animateWithDuration:((self.collectionView.collectionViewLayout.collectionViewContentSize.width - self.collectionView.contentOffset.x) / 75) delay:0 options:(UIViewAnimationOptionCurveLinear | UIViewAnimationOptionAllowUserInteraction | UIViewAnimationOptionRepeat | UIViewAnimationOptionBeginFromCurrentState) animations:^{
            self.collectionView.contentOffset = CGPointMake(self.collectionView.collectionViewLayout.collectionViewContentSize.width, 0);
        } completion:nil];
    }
}

最佳答案

您应该简单地在动画 block 中添加 [self.view layoutIfNeeded];,如下所示:

[UIView animateWithDuration:((self.collectionView.collectionViewLayout.collectionViewContentSize.width - self.collectionView.contentOffset.x) / 75) delay:0 options:(UIViewAnimationOptionCurveLinear | UIViewAnimationOptionAllowUserInteraction | UIViewAnimationOptionRepeat | UIViewAnimationOptionBeginFromCurrentState) animations:^{
            self.collectionView.contentOffset = CGPointMake(self.collectionView.collectionViewLayout.collectionViewContentSize.width, 0);
            [self.view layoutIfNeeded];
        } completion:nil];

关于ios - 动画 UICollectionView contentOffset 不显示不可见的单元格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22389904/

相关文章:

ios - 在 Swift 2 中剪切数组元素

ios - CFStringTransform 和 Swift 3 中 'init' 的使用不明确

ios - 是否可以在不显示/添加 View 的情况下在 iOS 上播放 YouTube 视频,同时仍然遵守 YouTube 的服务条款?

ios - SwiftUI 表单中的部分转换

java - 我可以在我的 Activity 加载之前显示动画吗?

ios - 如何将工具栏实现为 UICollectionView 的标题

ios - 核心数据按自增索引排序?

python - matplotlib 动画 : write to png files without third party module

ios - 一旦满足某些条件,如何立即重新加载 UICollectionView 单元格

iphone - UICollectionView 不显示单元格图像