1

CoreGraphicsカスタム描画コードを含むUIViewサイズの変数があります。drawRectビューは元々非常に小さかったが、非常に広くなる可能性がありUIScrollView、ユーザーがビューをスクロールできるように内部に配置されます。

現時点では、ビューは図面全体に合わせて必要な幅になるように作成されており、CoreGraphicsコードはのビュー全体に描画されdrawRectます。

- (void)drawRect:(CGRect)rect {

    // Only try and draw if the frame size is greater than zero and the graph has some range
    if ((self.frame.size.width>0) && (self.frame.size.height>0) && ((maxX - minX)>0)) {

        // Get the current drawing context
        CGContextRef context = UIGraphicsGetCurrentContext();

        // Save the state of the graphics context
        CGContextSaveGState(context);

        // Set the line style
        CGContextSetRGBStrokeColor(context, 0.44, 0.58, 0.77, 1.0); 
        CGContextSetRGBFillColor(context, 0.44, 0.58, 0.77, 1.0);
        CGContextSetLineWidth(context, 3.0);
        CGContextSetLineDash(context, 0, NULL, 0);

        // Draw the graph
        [self drawGraphInContext:context];

        // Restore the graphics context
        CGContextRestoreGState(context);
    }
}

これをより効率的にすることができます:

  1. でrectパラメータを使用して境界計算を実行し、drawRect現在表示されているもののみを描画します。
  2. 小さい方UIView(たとえば、scrollViewフレームの幅の2倍)を作成し、スクロール位置が移動したら、画像を再描画して、scrollViewの中心を再設定します。

これらのいずれかを実行する前に、努力する価値があるかどうか、およびUIViewが非常に広くなった場合に後で問題が発生する可能性があるかどうかを理解したいと思います。これまでのところパフォーマンスは問題ではありませんが、メモリが問題になるのではないかと心配しています。

具体的には、scrollViewは、ビューが使用するメモリの量を表示領域に制限しますか?グラフィックスコンテキストは、ビュー全体のサイズ、表示領域、またはrectパラメーターのサイズを作成しましたか?表示領域外の描画操作は、CoreGraphicsによって単に無視されますか?

ヘルプとベストプラクティスのアドバイスをいただければ幸いです。

4

1 に答える 1

1

rectIMO、それはすべて呼び出しの引数に依存します:

- (void)drawRect:(CGRect)rect

私の知る限り、これはcontentSizeスクロールビューに設定されます。簡単に言えば、コンテキストとそれに使用されるメモリがそのrect値に関連付けられます。

frameスクロール ビューのを考慮して、描画する領域の独自の「クリッピング」を試みることもできます。

さらに良いことに、 UIScrollView でのコンテンツのタイリングに関する Apple のサンプルを見ることができます。サンプル3です。

于 2012-06-01T07:32:56.840 に答える