2010-11-25 18 views
1

私は、ユーザーに何らかの線グラフを提供するアプリを持っています。グラフを含むビューを含むUIScrollViewを使用しています。ビューは、CoreGraphicsを使用してグラフをdrawrectメソッドに描画しています。 グラフが長すぎると問題が発生します。グラフをスクロールすると、アプリが途切れてしまい、最終的にアプリがメモリ不足になり、終了します。他のアプリを見てみると、WeightBotアプリを作成したユーザーは、長時間進行中のグラフを問題なく管理できるようになったので、間違った方法でやっているようです。ScrollViewが大きすぎるとメモリ不足になる

このような長い線グラフがメモリの問題にぶつかることなくどのように作成されるのだろうか?

EDIT:

は基本的にすべての私はいくつかのコードを追加することがそれで、グラフの構築ビューにinitではのdrawRectメソッドだとscrollViewにサブビューとしてビューを追加します。データセットの

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

CGContextSetFillColorWithColor(c, self.backgroundColor.CGColor); 
CGContextFillRect(c, rect); 

//... do some initialization 

for (NSUInteger i = 0; i < xValuesCount; i++) 
    { 
     NSUInteger x = (i * step) * stepX; 

     NSUInteger index = i * step; 

     CGPoint startPoint = CGPointMake(x + offsetX, offsetY); 
     CGPoint endPoint = CGPointMake(x + offsetX, self.frame.size.height - offsetY); 

     CGContextMoveToPoint(c, startPoint.x, startPoint.y); 
     CGContextAddLineToPoint(c, endPoint.x, endPoint.y); 
     CGContextClosePath(c); 

     CGContextSetStrokeColorWithColor(c, self.gridXColor.CGColor); 
     CGContextStrokePath(c); 
    } 
} 
+0

最も重要なことは、グラフ全体ではなく、表示されている矩形を描画するようにしてください。あなたは私たちにいくつかのコードを示す必要があります。 –

+0

グラフは一度だけ描画されます。質問を明確にするためにコードを追加しました。 – Oysio

答えて

0

図うちどの部分が表示されている、とだけあなたがするために必要なものを描く:

これは、ビューののdrawRectを実装する方法です。

1

スーパービューが小さい場合でも、大きな描画(描画方法付き)は大量のメモリを必要とします。特大のサブビューには巨大なバックバッファが必要です。

代わりに、単にuiscrollingviewから直接サブクラス化してください。スクロールビューは視覚的な部分と同じくらい大きなものです。描画時に自動的にオフセットが処理されます。あなたの描画方法は常に呼び出されますが、それは大丈夫です。

1

の引数がdrawRect:の場合、描画の対象となるセクションが示されます。グラフのどの部分がその矩形内にあるかを調べるロジックを追加して、すべての呼び出しで全体を再描画するのではなく、それらを描画するだけです。

関連する問題