2

今私は以下を持っています:

- (void)drawRect
{
    // some drawing

    [bgImage drawinRect:self.bounds];

    // some drawing
}

私は40以上のビューを持っており、その中にテキストといくつかのマークがあります。ユーザーがタップするときにこれらすべてのビューを再描画する必要があります-それは本当に速いはずです!

コードをインストルメントして見たところ、すべての実行時間の75%が呼び出し[MyView drawRect:]であり、drawRect時間の95%が[bgImage drawinRect:self.bounds]呼び出しです。GPUまたはCPU内で背景を描画する必要があります。どうしてそれは可能ですか?

私が試したこと:

  1. drawRectの代わりにサブビューを使用します。私の場合、色のブレンドがうまくいかないため、非常に遅くなります。
  2. UIImageViewを背景として追加しても効果はありません。サブビューを描画することはできません...
  3. CALayerに画像レイヤーを追加しますか?出来ますか?

アップデート:

今私はdrawInRectの代わりにCALayerを使おうとしています。

- (void)drawRect
{
    // some drawing

    CALayer * layer = [CALayer layer];
    layer.frame = self.bounds;
    layer.contents = (id)image.CGImage;
    layer.contentsScale = [UIScreen mainScreen].scale;
    layer.contentsCenter = CGRectMake(capInsects.left / image.size.width,
                                      capInsects.top / image.size.height,
                                      (image.size.width - capInsects.left - capInsects.right) / image.size.width,
                                      (image.size.height - capInsects.top - capInsects.bottom) / image.size.height);

    // some drawing
}

現在、この新しいレイヤーの代わりに何も表示されていません。私の絵はすべてこのレイヤーの下にあると思います...

4

1 に答える 1

1

UILabels を使用します。shouldRasterize = YESラベルに背景色を指定するか、それらのラベルを保持するビューのレイヤーに設定することで、ブレンドのコストを削減できます。(おそらくrasterizationScale、 と同じになるように設定することもできます[[UIScreen mainScreen] scale])。

別の提案:

おそらく同じ問題を解決しようとする必要のあるオープンソースのカレンダー コンポーネントがたくさんあります。おそらく、彼らがそれらをどのように解決したかを見てみることができます.

于 2012-08-25T13:54:58.850 に答える