2

カウントがあり、バッジ付きのセルを使用しています。私が望むのは、このカウントを取得したときに、バッジ番号を 0 に設定し、0 からいくつかのカウントへの増分をアニメーション化することです。

これが私が試したものですが、うまくいきませんでした:

for (int i = 0 ; i<=item.count; i++) {
     int64_t delayInSeconds = .1f;
     dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
     dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
           [UIView animateWithDuration:0.1f animations:^{
               cell.badgeString = [NSString stringWithFormat:@"%d",i];
           }];
           NSLog(@"%@",cell.badgeString);
     });
}

アニメーションしません。私はこれをtableView:cellForRowAtIndexPathで行っており、セルを返す前にそれを行っているので、それが問題です。

ありがとう!

4

2 に答える 2

1

そのため、私が別の方法で行うことがいくつかあります...

そうです、cellForRow はこれを行うには不適切な場所です。willDisplayCell でアニメーションをトリガーしてみてください。トリガーとは、初期値を設定し、[cell performSelector:@selector(startAnimation) withObject:nil afterDelay:0]; を使用して次の実行ループでアニメーションを開始することを意味します。またはその趣旨の何か。

また、for ループでディスパッチを呼び出すのはよくありません。アイテムから新しい値を取得するたびに、同じアニメーション ブロックをトリガーする完了ブロックを使用してアニメーション ブロックを設定できます。どこかで現在の値を追跡する必要があります。

オブジェクト項目が何であれ、カスタムセルが必要になるでしょう。それを cellForRow に設定します。prepareForReuse でアニメーションをキャンセルします。アニメーション コードは、カスタム セルのメソッドに入れることができます。上記の例では、startAnimation と呼ばれています。

于 2012-10-22T19:07:19.077 に答える
0

これは、ループが完了するまで UI 要素が更新されず、この方法を使用すると、数値が実際にインクリメントされるまでの時間を制御できないためです。

1 つの解決策は、NSTimer を使用してラベルをインクリメントした関数を呼び出すことですが、ラベルのインクリメントをすばやく確認したい場合は、1 つを数秒以上実行することはお勧めしません。

于 2012-10-22T19:00:54.683 に答える