2010-11-25 53 views
1

我有一個應用程序向用戶提供某種線圖。我正在使用包含圖形視圖的UIScrollView。這個視圖使用CoreGraphics來繪製它的直方圖。 圖形變得太長時會出現問題。滾動瀏覽圖表似乎是口吃,最終應用程序將耗盡內存並退出。環顧其他應用程序,我看到創建了WeightBot應用程序的人能夠管理長期持續的圖形,沒有任何問題,所以顯然我做的是錯誤的方式。ScrollView在內存過大時耗盡內存

我想知道如何創建這種長線圖而不會碰到內存問題?

編輯:加入一些代碼

基本上所有我做的是初始化它建立在它的圖形視圖的drawRect方法並添加視圖作爲一個子視圖的滾動視圖。

這是視圖的drawRect是如何實現的:

- (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

最重要的是,確保你只繪製可見矩形而不是整個圖形。你需要向我們展示一些代碼。 – 2010-11-25 21:45:53

回答

0

弄清楚你的數據集的部分是可見的,而只畫你需要什麼。

1

大視圖(使用繪製方法)需要大量內存,即使其超視圖很小。你超大的子視圖將需要一個巨大的緩衝器。

相反,直接從uiscrollingview直接子類。滾動視圖只與其視覺部分一樣大。繪圖時會自動處理偏移量。你的抽籤方法會一直被調用,但這應該沒問題。

1

drawRect:的參數rect表示您被要求繪製哪部分視圖。你應該添加一些邏輯來確定你的圖的哪些部分在那個矩形中,並且只繪製它們,而不是在每次調用時重繪整個事物。