1

我有带有单元格的 UICollectionView。我需要更改 UIImageView 中的单元格图像。但是我需要改变它不是在一个单元格中,而是从一个单元格更改为 30,例如。(需要改变值的单元格是改变。)我想用动画来做这个。另外,我不想同时更改所有必须更改的单元格。我想先改变一些,在短时间内改变更多等等,直到一切都改变。可能吗?有什么例子可以说明我如何做到这一点吗?

我已经制定了一种可以立即更改的方法,但这不是我想要的。如果有人想查看此代码,我将在更新后将其发布在这里,目前我没有理由发布它(因为我认为这是一种完全不同的方式,以显示同时更改和部分更改)。

4

1 回答 1

3

一点也不难,实际上,这完全取决于您如何加载单元格。例如,我刚刚做了一个简单的 hack:

动画细胞.m

UICollectionViewCell 子类

- (void)setImage:(UIImage*)image animatedWithDelay:(NSTimeInterval)delay
{
    self.imageView.image = image;
    
    // Apply the change immediately
    if (delay < 0.01)
    {
        return;
    }
    
    self.imageView.alpha = 0.0;
    
    [UIView animateWithDuration:0.5 delay:delay options:UIViewAnimationOptionAllowUserInteraction | UIViewAnimationOptionCurveEaseInOut animations:^{
        self.imageView.alpha = 1.0;
    } completion:nil];
}

这是一个使用 UIView 方便的动画方法的简单淡入,你以后可能想要更花哨的东西!无论如何,现在,我们需要设置内容并计算适当的延迟。

视图控制器.m

符合 UICollectionViewDataSource 和 UICollectionViewDelegate

@interface ViewController () <UICollectionViewDataSource, UICollectionViewDelegate>

@property (nonatomic,assign) CGFloat delay;

@end

@implementation ViewController

CGFloat const kDelayMinimum   = 0.02;
CGFloat const kDelayIncrement = 0.01;

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    AnimatedCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"collection.cell" forIndexPath:indexPath];
    
    [cell setImage:[UIImage imageNamed:@"photo.png"] animatedWithDelay:self.delay];
    
    self.delay += kDelayIncrement;
    
    return cell;
}

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
    self.delay = kDelayMinimum;
}

// <Rest of the code>

@end

这真的是一个简单的技巧,我只是增加每个正在呈现的单元格的延迟,然后,当用户滚动时,延迟重置为最小值,否则,延迟会增长并失控。

您需要弄清楚如何将其正确插入数据源,处理图像未加载的情况等,但将此作为工作的基础。

于 2013-07-17T01:38:41.520 回答