2010-11-25 62 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表示您被要求绘制哪部分视图。你应该添加一些逻辑来确定你的图的哪些部分在那个矩形中,并且只绘制它们,而不是在每次调用时重绘整个事物。