6

UIBezierPath指の動きに基づいてビューにいくつかの s を描画しています。

タッチのサイクル (Began/Moved/Ended) が完了するたびに、ポイントをUIBezierPath保存し、 という配列に保存される を作成しますbezierArraybezierArrayColors各パスの色を格納するという別の配列があります。

問題はこれです。クラスはdrawRect. 私が見る限り、実行するたびにdrawRect、これまでに作成されたすべてのパスを描画する必要があり、アプリは遅くなりました。

これが私のdrawRect今です。私はそれがかなり不自由であることを知っていますが、これがどのように行われるかわかりません。

- (void)drawRect:(CGRect)rect {
   for (int i=0; i<[self.bezierArray count]; i++) {
        UIBezierPath *aPath = (UIBezierPath*)[self.bezierArray objectAtIndex:i];
        UIColor *aColor = (UIColor*)[self.bezierArrayColor objectAtIndex:i];
    [aPath setLineWidth:LINE_WIDTH];

    [aColor setStroke];
    [aPath stroke];
    }
}

UIBezierPathサブパスを使用して、異なる色または幅でa をストロークする方法はありますか? つまり、サブパスの色、幅、その他のプロパティを変更するには? UIBezierPathこれにより、複数の異なるサブパスで1 つを使用できるようになります。毎回再描画する必要なく、1 つのベジエを描画してそのままにしておくことができればいいのにと思います。私は何が欠けていますか?

4

3 に答える 3

6

-drawRect: に渡される rect に注意してください。あなたのコードが簡単な方法を取り、-drawRect: が呼び出されるたびにビュー全体を再描画する場合、少なくとも時々、必要以上に多くの描画を行っている可能性があります。

于 2011-06-05T02:53:55.130 に答える
2

各ベジエ パスを個別のサブビューに描画します。そうすれば、各ベジエは、それ自体が変更されたときにのみ再描画する必要があります。

于 2011-06-05T01:26:58.553 に答える
0

同様の問題があり、サブビューを使用してすべての「完了」パスを保持し、別のサブビューを使用して「進行中」のパスのみを保持する予定です。このようにして、「進行中」のパスの新しい touchesmoved イベントを取得するため、完了したすべてのパスを描画する必要はありません。パスが完成したら、それを完成した配列に移動し、完成したサブビューを再描画して、次のタッチを待ちます。これにより、「何兆ものサブビュー」の問題が回避され、遅延に非常に敏感なタッチに実際に応答しようとしているときにパスの配列全体を再描画することも回避されます。これを始めたら、ここに戻ってコードを書くことを忘れないようにします。

于 2011-06-26T01:18:52.793 に答える