6

私のアプリケーションは、いくつかの単純な図形の描画を行うことができ(より安定したコードを取得するまで、1つの図形のみを使用します)、サイズを変更することもできます。を作成するために使用するコードUIViewは次のとおりです。

- (void)drawRect:(CGRect)rect
{    
    CGContextRef context = UIGraphicsGetCurrentContext();

    [self setContextFillColor:context];
    [self setContextStrokeColor:context];
    [self setLineWidth:context];

    CGFloat lineThickness = [self lineWidth] ;
    CGFloat halfLineThickess = lineThickness / 2.0f;

    CGContextAddRect(context, CGRectMake(halfLineThickess,halfLineThickess, rect.size.width - lineThickness, rect.size.height - lineThickness));

    CGContextDrawPath(context, kCGPathEOFillStroke);
}

これにより、入力サイズが(100.0f、100.0f)の場合、次のようになります。

ここに画像の説明を入力してください

この図は「コンテナ」の中にあり、「コンテナ」UIViewはの中にありUIScrollViewます。これに関する私の問題は、フィギュアのサイズを変更していて、サイズが約1000 * 1000(私の「コンテナ」は20,000 * 20,000)に達したときに、メモリ警告を受け取り始め、アプリケーションが最終的にあきらめることです。だから私の質問は:

1)最大サイズを入れることを検討する必要がありUIViewますか?

2)この種の問題を追跡し、問題がどこで発生しているのか(またはどこで重い作業が行われているのか)を確認するために、どのように機器を使用できますか?

3)このようなキャッシュを使用する必要がありますか?

4)描画するときに考慮すべき一般的なベストプラクティスUIViewはありますか?

5)CALayerタッチを聞く必要がありますが、検討する必要がありますか?

のサイズ変更は、主にこれUIViewに基づいています。

4

2 に答える 2

1

1)正しいアプローチを使えば、サイズは問題ないと思います。

2)Instrumentsを使用して、メモリの問題の追跡に関するWWDCビデオを確認する必要があります

- (void)drawRect:(CGRect)rect3,4)それは良い習慣ではないと思います。図面を見ればもっといいでしょうCALayer。カスタムCGMutablePathRefを使用して描画できます。

したがって、UIViewはタッチの処理には適していますが、図形の描画には適していません。

于 2012-10-17T17:30:32.327 に答える
1

これほど大きなUIViewを作成しないでください。大きすぎます。この種の問題は、CATiledLayer対処するために設計されたものです。基本的に、シェイプのバウンディングボックスを追跡し、それらのバウンディングボックスを使用して、どのタイルがどのシェイプと交差するかを把握する必要があります。システムが特定のタイルを要求したら、それと交差するすべての形状を描画します。非常に大きく複雑な形状の場合、形状を分割することでさらに最適化できますが、多くの場合、これは必要ありません。

于 2012-10-18T15:49:18.043 に答える