2012-10-17 6 views
6

私のアプリケーションでは、単純なFigureの描画を行うことができます(より安定したコードを得るまで、私は1つのFigureのみを貼り付けています)。私はUIViewを作成するために使用するコードは以下の通りである。UIViewの描画のベストプラクティス

(100.0f、100.0f)の入力サイズと私を与え
- (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); 
} 

、この:

enter image description here

この図はあります「容器」UIViewの内側にあり、内側はUIScrollViewです。私の問題は、私の姿をサイズ変更して、サイズが約1000 * 1000(私の "コンテナ"は20,000 * 20,000)に達したとき、私はメモリ警告を受け取り、アプリケーションはついに諦めます。だから私の質問は:

1)UIViewの最大サイズを入れてみるべきですか?

2)この種の問題を追跡するために計測器を使用して、どのように問題が発生しているのか(または重い持ち上げがどこで行われているのか)を確認するにはどうすればよいでしょうか。

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

4)を描画するときに、いくつかの一般的なベストプラクティスを考慮する必要がありますか?

5)私はCALayerを考慮する必要がありますが、私は触れる必要がありますか?

UIViewのリサイジングは、ほとんどがthisに基づいています。

+0

QuartzCoreの使用を検討しましたが、ビューのレイヤープロパティを使用して境界線を描いただけでしたか? – runmad

+0

事は:これは簡単な図です。最終的に私はもっと複雑なものを持っています。私は 'UIView'のプロパティで遊んでいるとは思えません。しかし、提案に感謝します。 – Peres

+2

大きなコンテンツを(多分ズームで)描画する必要がある場合は、「CATiledLayer」をチェックしたいかもしれません。http://developer.apple.com/library/ios/#documentation/GraphicsImaging/Reference/CATiledLayer_class/Introduction/Introduction.html – Bastian

答えて

1

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

1

1)正しいアプローチを使用している場合、サイズは問題ではないと思います。

2)あなたはメモリの問題

3,4の追跡についてWWDCのビデオを見て楽器を使用する必要があります)私はそれが良い習慣ではありません- (void)drawRect:(CGRect)rectと思います。あなたが図面CALayerを見るなら、より良くなるでしょう。作図にはCGMutablePathRefというカスタムを使用できます。

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

+0

私はまた、その特定の 'UIView'(移動やサイズ変更のような)でジェスチャーを処理したいと思っています。それはここでの問題はありません – Peres

+0

@JackyBoyはいくつかのステップである: 1)新しいビューを作成 'のUIView * view' 2)新しいレイヤーを作成 'のCALayer * shapeLayer view.layer = shapeLayer' 3)追加ジェスチャー '[ビューaddGestureRecognizer:panGesture]; ' – Danil

関連する問題