0

かなり複雑なセルを含むテーブル ビューがあります。セルにはボタンが含まれており、押すとセルが展開され、追加のコントロールが表示されます。これはかなり簡単だと思ったので、次のコードを書きました (UITableViewCell から派生したクラスで):

self.extraView = [[MyView alloc] initWithFrame:CGRectMake(0,100,300,200)];
self.extraView.clipsToBounds = YES;
[self addSubview:self.extraView];

self.extraView.transform = CGAffineTransformMakeScale(1, 0.1f);
[UIView animationWithDuration:0.5 animations:^{
    [tableView beginUpdates];
    [tableView endUpdates];
    self.extraView.transform = CGAffineTransformIdentity;
}];

驚くべきことに、これによりextraView画面上で短時間フラッシュが発生し、その後消えます。への呼び出しを削除するbeginUpdatesと、期待どおりにアニメーション化されますendUpdatesextraViewただし、表のセルは表示するのに十分な大きさではありません。alpha を 0 に設定してから、テーブルの更新中にフェードインしようとしましたが、うまくいくようです。残念ながら、私はそのextraView場で成長させ、衰退させないようにすることになっています.

フレームの変更など、さまざまな変更方法を試しextraViewましたが、テーブルの更新には常に何らかの副作用が生じます。また、完了ハンドラーでスケール変更をチェーンしようとしましたが、もちろんうまくいきませんでした。これは、完了ブロックが実行されたときにテーブルビューがアニメーション化されていないためだと思います。

テーブルの更新中にセル内のビューのフレームをアニメーション化する方法はありますか?

4

2 に答える 2

0

答えはノーのようです。少なくとも、テーブルビューの更新中にビューフレームを変更したときに視覚的に正しく見えるものは見つかりませんでした。代わりに、少し待ってからビューのフレームを拡大します。コードは次のようになります。

extraView.alpha = 0; // hide the view immediately after adding it
[tableView beginUpdates];
[tableView endUpdates];
[UIView animateWithDuration:0.5 animations:^{
    button.alpha = 0; // fade out old button
} completion:^(BOOL finished) {
    extraView.alpha = 1; // reappear, but not fading in
    extraView.transform = CGAffineTransformMakeScale(1, 0.01f);
    [UIView animateWithDuration:0.5 animations:^{
        extraView.transform = CGAffineTransformIdentity; // animate scale back to original size
    }];
}];

これは私が作成しようとしていた効果とは異なりますが、私が得たものに最も近いものです。他の誰かが同様の問題に遭遇した場合の答えとしてそれを投稿しています。

于 2013-01-31T19:49:42.307 に答える
0

同様の問題があり、セル内の特定の要素を選択に基づいてアニメーションで開閉および変更したいと考えていました。

これを行うには、最初に uitableviewcell のサブクラスを作成しました。

各 tableviewcell には、(とりわけ) backgroundcolor とサイズのアニメーションを実行する open メソッドと close メソッドがあります。

tableviewcell の open メソッドと close メソッドは次のようになります。

- (void)open {

        [UIView animateWithDuration:0.3
                         animations:^{
                             [self.customBackgroundView setHeight:76];
                             self.deleteButton.alpha = 1;
                             self.selectedIndicator.transform = CGAffineTransformMakeRotation(M_PI);
                             [self.selectedIndicator setY:60];
                         }

         ];


}

- (void)close {
        [UIView animateWithDuration:0.3
                         animations:^{
                             [self.customBackgroundView setHeight:40];
                             self.deleteButton.alpha = 0;
                             self.selectedIndicator.transform = CGAffineTransformMakeRotation(0);
                             [self.selectedIndicator setY:24];
                         }

         ];
}

また、setSelected メソッドがあるため、セルが選択されるとセルが開きます。

- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
    [super setSelected:selected animated:animated];
    if (selected) {
        [self open];
    } else {
        [self close];
    }
}

あとは、このセルが選択されているときに、他のセルを確実に閉じることだけです。そして、テーブルビュー beginUpdates とテーブルビュー endUpdates を呼び出します。

   - (void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {

            if (_currentSelection == indexPath.row) {
                _currentSelection = -1;
                SOColumnTableViewCell *cell = (SOColumnTableViewCell *)[tableView cellForRowAtIndexPath:indexPath];
                [cell close];
            } else {
                _currentSelection = (int)indexPath.row;

            }
            [tableView beginUpdates];
            [tableView endUpdates];

        }

    }
于 2014-04-08T08:26:15.730 に答える