2011-03-12 8 views
1

ユーザーが自分のテーブルビューセルの1つをタップしたときに発生するアニメーションを実装しようとしています。基本的に、アニメーションは「+5」や「+1」のようなテキストの小さなラベルで、フェーディング中に上に移動します(基本的にユーザーがポイントしたときにポイントがビデオゲームに表示されます)。私のコントローラのtableView:didSelectRowAtIndexPath:実装でアニメーションの進行中にUITableViewと対話できない

、私は(ここでは簡単のために言い換え)次のことをやっている:

CGRect toastFrame = /* figure out the frame from the cell frame here */; 
UILabel *toast = [[UILabel alloc] initWithFrame:toastFrame]; 
toast.text = [NSString stringWithFormat:@"+%d", 5]; 
toast.backgroundColor = [UIColor clearColor]; 
toast.userInteractionEnabled = NO; // hoped this would work but it doesn't 
[tableView addSubview:toast]; 

[UIView 
animateWithDuration:1.0 
animations:^ 
{ 
    toast.alpha = 0.0; 
    toast.transform = CGAffineTransformMakeTranslation(0.0, -44.0); 
} 
completion:^ (BOOL finished) 
{ 
    [toast removeFromSuperview]; 
}]; 

[toast release]; 

トーストがうまく表示されると素晴らしく見えるされます。問題は、アニメーションが完了するまで、テーブルビューがタッチイベントの受信を停止することです。つまり、テーブルビューでセルをタップしてから1秒間は、テーブルビュー内の他のセルをタップすることはできません。

これが起こらないようにする方法はありますか?アニメーションがまったく起こっていないかのようにユーザーがテーブルビューとやりとりを続けられるようにする方法はありますか?

ありがとうございました。

答えて

5

別のオプションは、(私の頭の上から、テストされていない)animateWithDuration:delay:options:animations:completion:を使用することであってもよい

UIViewAnimationOptionsによって定義されoptionsパラメータと可能なフラグを見て、ください。含まれているのはUIViewAnimationOptionAllowUserInteractionというフラグです。このの解決策になる可能性があります。

+0

Brilliant!それがそれでした。それをブロックする方法の良い点は、ブロックが外部からビューを自動的に保持するので、完了ハンドラが呼び出される前に一時的なビューが破棄されないように手作業で気にする必要がないことです。また、公式に推奨されている方法でそれをやっていることの疑わしい満足感を与えます:) – glenc

+0

5年後、あなたはまだ私の日を救った。ありがとうございました! –

1

他の方法でやってみましたか?たとえば、トーストをサブビューとして追加した後は、次のようにすることができます。

[UIView beginAnimations:nil context:NULL]; 
[UIView setAnimationCurve: UIViewAnimationCurveEaseOut]; 
[UIView setAnimationDuration: 1.0]; 
toast.alpha = 0.0; 
toast.frame.origin.y -= 44.0; 
[toast performSelector:@selector(removeFromSuperview) withObject: nil afterDelay: 1.0]; 
[UIView commitAnimations]; 

次にリリースします。あなたはこの方法で試して、それが動作するかどうかを見ることができます。

+0

こんにちは - これは本当にありがとう、これは実際に動作し、私に望ましい動作を与えます。私はブロックアニメーションの方法がなぜ機能しないのかを知りたいのですが、これは今、お勧めの方法です。 – glenc

+0

本当に、これは今のお勧めの方法ですか?ブロックメソッドではうまくいかない理由は、ブロックメソッドは新しいスレッドを作成しませんが、このメソッドは新しいスレッドを作成し、すべての作業は他のスレッドで行われるということだけが考えられます。ほとんどの人はアニメーション中にインタラクションを有効にする必要がないため、リソースを節約するためにデフォルトの動作として設定しているかもしれません。そのほとんどの場合、このメソッドを使用できます。ちょうど私の推測。 – Omar

+0

'[UIView beginAnimations:context:]'のドキュメントによると、これを行う方法は推奨されなくなりました(あなたのアプリケーションが少なくともiOS 4.0を必要とすると仮定して):http://developer.apple.com/library/ios/ #documentation/uikit/reference/UIView_Class/UIView/UIView.html#// apple_ref/doc/uid/TP40006816-CH3-SW14 – glenc

関連する問題