2009-08-09 10 views
3

私は個人的なサイドプロジェクトとしてシンプルなiPhoneの描画プログラムを作っています。クォーツ2DのシンプルなiPhoneの描画アプリ

サブクラス化されたUIViewでtouchesイベントをキャプチャし、実際のものを別のCGLayerにレンダリングします。各レンダリングの後、[self setNeedsLayout]を呼び出し、drawRect:メソッドでCGLayerを画面コンテキストに描画します。

これはすべて機能し、矩形を描画するのに適しています。しかし、私はちょうど他の多くのiPhoneアプリケーションのような単純な "フリーハンド"モードが欲しいです。しかし、1秒以上描画した後、パフォーマンスが低下する無残

 
CGMutablePathRef path; 
-(void)touchBegan { 
    path = CGMutablePathCreate(); 
} 
-(void)touchMoved { 
    CGPathMoveToPoint(path,NULL,x,y); 
    CGPathAddLineToPoint(path,NULL,x,y); 

} 
-(void)drawRect:(CGContextRef)context { 
     CGContextBeginPath(context); 
     CGContextAddPath(context,path); 
     CGContextStrokePath(context); 
} 

を:私はこれを行うには考え

方法はCGMutablePathを作成し、簡単にすることでした。

変数が不透明でない場合は、オフラインCGLayerに各行を描画します。不透明度が100%未満であると、線を結んでいるドットが画面上に残ります。私はCGContextSetBlendingMode()を見てきましたが、うーん、私は答えを見つけることができません。

誰でも正しい方向に向けることができますか?他のiPhoneアプリでもこれを非常に効率的に行うことができます。

答えて

1

CGStrokePath()を使用すると、現在の変更可能なパスが閉じて描画され、指を動かすと新しいパスが作成されるという問題があります。だから、ワンタッチで "セッション"のために多くのパスをとることになるでしょう。少なくとも、あなたの擬似コードはそうしているようです。

タッチが始まるときに新しい可変パスを開始しようとすると、タッチが終了したときにタッチが移動して終了するときにCGAddLineToPoint()を使用します(擬似コードの場合とほとんど同じです)。しかしdrawメソッドでは、現在の可変パスのコピーを描画します。実際の変更可能なパスは、タッチが終了するまで引き伸ばされているため、タッチセッション全体に対して1つのパスしか得られません。タッチが終了した後、パスを永続的に追加することができます。たとえば、すべてのパスを配列に入れ、drawメソッドで繰り返し処理することができます。

1

SanHoloが言っていること - あなたはポイントの追加を抑制したいので、10msごとに新しいポイントを追加するだけです(例えば、その間隔で遊ぶ必要があります)。あなたは簡単なタイマーでそれを行うことができます。

また、自分自身を再描画する必要があるというビューをどのように指示していますか?ポイントをキャプチャするよりも長い間隔でキャプチャすることもできます(キャプチャポイントは10ミリ秒以下、再描画は200ミリ秒以下にする必要があります) 。

どちらの場合も、間隔よりも長く何も起こらない場合は、最後のポイントがキャプチャされるか、再描画が要求されることを確認する必要があります。それがタイマーが入る場所です。

関連する問題