2009-03-29 22 views
2

私はiPhoneアプリケーションのための非常に単純な線画アニメーションを実装しようとしています。遅れて私の視野に長方形を描きたい。私は描画メソッドを実行するのにperformSelectorを使用しています。その後、経由で起動され遅延描画によるシンプルなアニメーション

-(void) drawRowAndColumn: (id) rowAndColumn 
{ 
    int rc = [rowAndColumn intValue]; 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGContextSetLineWidth(context, 2.0); 
    CGContextSetStrokeColorWithColor(context, currentColor.CGColor); 
    CGRect rect = CGRectMake(rc * 100, 100, 100, 100); 
    CGContextAddRect(context, rect); 
    CGContextDrawPath(context, kCGPathFillStroke); 

} 

int col = 10; 
[self performSelector:@selector(drawRowAndColumn:) 
      withObject:[NSNumber numberWithInt:col] 
      afterDelay:0.2]; 

しかし、drawRowAndColumn:メッセージが実際に送信されたとき、私のようなエラーを取得として、それはもはや、有効CGContextRefへのアクセス権を持っていないようです:

<Error>: CGContextAddRect: invalid context 

performSelectordrawRowAndColumnへの直接の呼び出しで置き換えた場合、正常に動作します。だから私の最初のアイデアもperformSelector経由CGContextRefに渡すことでしたが、私は、同時に複数の引数を渡す方法を見つけ出すように見えることはできません(それは別の良い質問ですね。)

は、上記のコードで何が悪いのでしょうか?

答えて

3

あなたはそのようないつでも描画することはできません。 UIViewのdrawRect:メソッドを実装し、そこに描画コードを配置する必要があります。 drawRect:を起動させるには、ビューを描画する必要があることをCocoaに知らせる必要があります。そのためには、setNeedsDisplay、またはsetNeedsDisplayInRect:に電話することができます。

あなたの試行をこのように直接変換すると、performSelector:withObject:afterDelayを使用してsetNeedsDisplayを呼び出すことができますが、それはおそらくアニメーションを行うには良い方法ではありません。

これは実際に何をしようとしているかによって異なりますが、たとえば図面コードをdrawRectに入れて、私が示唆したように表示することも考えられますが、隠しビューを開始します。その後、performSelectorを使用してsetHidden:NOを呼び出して、遅延の後に表示させることができます。または、隠されていない状態でアニメーションをスムーズにアニメーションできますが、0のアルファを使用し、UIViewアニメーションブロック内でアルファを1に変更しますこれはドキュメントにあります)。

+0

私はそれが何か簡単だったことを知っていました、ありがとう! –

+1

アニメーションを行うにはどうすればいいですか? – mk12

+0

コアアニメーション、または上位レベルのUIViewラッパーを使用します。それは私の答えの最後の段落(UIViewアニメーションブロック)について話していたものです。アニメーションブロックを開始し、いくつかのUIViewプロパティを設定し、アニメーションをコミットし、プロパティの変更をアニメーション化します(タイミングなどを制御できます)。 – philsquared

関連する問題