1

セルを含む UICollectionView があります。UIImageViewでセル画像を変更する必要があります。ただし、1 つのセルではなく、たとえば 1 つのセルから 30 に変更する必要があります。(値を変更する必要があるセルは変更です。)これをアニメーションで作りたいです。また、変更が必要なすべてのセルを同時に変更したくありません。私は最初にそれのいくつかを変更したいと思います. しばらくしてから、すべてが変更されるまでさらに変更してください. 出来ますか?そして、私がこれを行う方法の例はありますか?

私はすでに一度にすべてを変更するメソッドを作成しましたが、これは私が望むものではありません。誰かがこのコードを見たい場合は、更新後にここに投稿します。今のところ、投稿する理由がわかりません (同時変更と部分変更を示すために、これはまったく別の方法だと思うため)。

4

1 に答える 1

3

それほど難しいことではありません。実際には、すべてセルのロード方法に依存します。たとえば、私が作成したばかりの簡単なハック:

AnimatedCell.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 の便利なアニメーション メソッドを使用した単純なフェードインです。とにかく、コンテンツを設定し、適切な遅延を計算する必要があります。

ViewController.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 に答える