12

UICollectionViewCellユーザーがセルをタップしたときにアニメーションを開始したいと思います。私の考えは、対応するセルを選択してdidSelectItemAtIndexPathアニメーションをトリガーすることでした。ただし、これは機能しません。

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
{
    // animate the cell user tapped on
    ProductCollectionViewCell* cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"ProductReuseID" forIndexPath:indexPath];
    
    [UIView animateWithDuration:5.0
                          delay:0
                        options:(UIViewAnimationOptionAllowUserInteraction)
                     animations:^{
                         NSLog(@"animation start");
                         [cell.layer setBackgroundColor:[UIColor colorWithRed: 180.0/255.0 green: 238.0/255.0 blue:180.0/255.0 alpha: 1.0].CGColor];
                     }
                     completion:^(BOOL finished){
                         NSLog(@"animation end");
                         [cell.layer setBackgroundColor:[UIColor whiteColor].CGColor];
                     }
    ];
}

実際には、アニメーションは同時に開始および終了します (ただしanimateWithDuration、5 に設定されています)。次の試みは、アニメーションをスキップして、たとえば別の境界線スタイルを設定することでした:

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
{
    // animate the cell user tapped on
    ProductCollectionViewCell* cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"ProductReuseID" forIndexPath:indexPath];
    
    [cell.layer setBorderWidth:5.0f];
}

ただし、これは何も変更しません (おそらくセルを手動で再描画する必要があるためですか?)。

ユーザーがタップしたときに UICollectionViewCell をアニメーション化する方法はありますか?

敬具、クリスチャン

4

2 に答える 2

33

間違ったセルを取得しているようです。dequeueReusableCellWithReuseIdentifier:forIndexPath:メッセージを送信しても、ビューで使用中のセルは 2 番目のパラメーターの indexPath で取得されませんが、以前に使用されたが再利用可能なセルがキューから取り出されます。再利用可能なセルがない場合は、新しいセルが作成されます。以下の参考文献 1 を参照してください。

交換:

ProductCollectionViewCell* cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"ProductReuseID" forIndexPath:indexPath];

と:

ProductCollectionViewCell* cell = [collectionView cellForItemAtIndexPath:indexPath];

上記のコードでは、操作する適切なセルを提供する必要があります。

これがあなたの最初の例です。

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath(NSIndexPath *)indexPath
{
    // animate the cell user tapped on
    UICollectionViewCell  *cell = [collectionView cellForItemAtIndexPath:indexPath];    
    [UIView animateWithDuration:5.0
            delay:0
            options:(UIViewAnimationOptionAllowUserInteraction)
                animations:^{
                    NSLog(@"animation start");
                    [cell setBackgroundColor:[UIColor colorWithRed: 180.0/255.0 green: 238.0/255.0 blue:180.0/255.0 alpha: 1.0]];
                }
                completion:^(BOOL finished){
                    NSLog(@"animation end");
                    [cell setBackgroundColor:[UIColor whiteColor]];
                }
    ];
}

参考文献:

于 2012-11-27T03:44:12.287 に答える
2

コードに従って、カスタム アニメーション期間で UICollectionViewCell を選択/タップしながら、アニメーションをカスタマイズできます。したがって、背景色を変更する必要はありません。

次のオプションを使用 - UIViewAnimationOption

  • UIViewAnimationOptionCurveEaseIn
  • UIViewAnimationOptionCurveEaseOut
  • UIViewAnimationOptionAllowUserInteraction

    UICollectionViewDelegate - didSelectItemAtIndexPath メソッド

    UICollectionViewCell *uviCollectionCell =  [collectionView cellForItemAtIndexPath:indexPath];
    
    [UIView animateWithDuration:0.4 delay:0 options:(UIViewAnimationOptionCurveEaseIn) animations:^{
            NSLog(@"animation start");
            CALayer *layer = uviCollectionCell.layer;
            CATransform3D rotationAndPerspectiveTransform = CATransform3DIdentity;
            rotationAndPerspectiveTransform = CATransform3DRotate(rotationAndPerspectiveTransform, 15.0f * M_PI / 180.0f, 1.0f, 0.0f, 0.0f);
            layer.transform = rotationAndPerspectiveTransform;
    } completion:^(BOOL finished) {
            [UIView animateWithDuration:0.3 delay:0 options:(UIViewAnimationOptionCurveEaseOut) animations:^{
                NSLog(@"animation end");
                CALayer *layer = uviCollectionCell.layer;
                CATransform3D rotationAndPerspectiveTransform = CATransform3DIdentity;
                rotationAndPerspectiveTransform.m24 = 0;
                rotationAndPerspectiveTransform =CATransform3DRotate(rotationAndPerspectiveTransform, 0.0f * M_PI / 180.0f, 1.0f, 0.0f, 0.0f);
                layer.transform = rotationAndPerspectiveTransform;
            } completion:nil];
        }
    ];
    
于 2016-02-18T10:21:12.660 に答える