7

我正在开发一个带有甘特图的小型 iPad 应用程序,它将显示过去 25 小时内的事件。我有 5 个缩放级别,每个级别为 1 小时、30 分钟、15 分钟、5 分钟和 1 分钟。我的单元格宽度为 30 像素。从每小时缩放级别开始,我有 25 * 30 像素 = 750 宽度的内容(无需滚动)。当缩放单元格宽度保持不变时,只会有更多单元格,我可以水平滚动。它适用于 30、15 和 5 分钟。当谈到 1 分钟级别(宽度为 45000 像素(30 * 1500)时,事情开始出错。滚动视图冻结(我仍然可以滚动,但显示没有更新)。

drawRect: 已经通过(所以它应该被正确绘制)。我可以在按钮上看到一个小滚动条(它甚至到达末尾)。所以我试图警惕宽度,似乎问题从大约 16300 像素宽度开始。有解决办法吗?或者任何一种解决方案?

我使用带有包含 uiview (Ganttchartview) 的 ScrollView,其中 drawRect: 我已重载。

放大,其中 CELL_WIDTH 为 30,zoomLevels 为 25、50、75、300、1500

 -(IBAction) zoomIn:(id)sender {
    self.zoomIndex++;
    int width = CELL_WIDTH * [[self.zoomLevels objectAtIndex: self.zoomIndex] intValue];
    self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y, width, self.frame.size.height);
    [self.parentView setContentSize: CGSizeMake(self.frame.size.width, self.frame.size.height)];
    [self setNeedsDisplay];
}

绘制线条的drawRect

- (void)drawRect:(CGRect)rect {
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetStrokeColorWithColor(context, [UIColor blackColor].CGColor);
    CGContextSetLineWidth(context, 2.0);        
    int interval = [[self.zoomLevels objectAtIndex: self.zoomIndex] intValue];
    int width = CELL_WIDTH;
    for (int i = 0; i < interval; i++) {
        CGContextMoveToPoint(context, width * (i +1), START_AT); 
        CGContextAddLineToPoint(context, width * (i +1), rect.size.height); 
        CGContextStrokePath(context);
    }
    for (int i = 0; i < NUMBER_OF_ROWS; i++) {
        CGContextMoveToPoint(context, 0, START_AT + i * CELL_WIDTH); 
        CGContextAddLineToPoint(context, rect.size.width, START_AT + i * CELL_WIDTH); 
        CGContextStrokePath(context);
    }
}
4

2 回答 2

3

我会建议此类应用程序使用无限滚动视图。这包括基于固定(和有限)contentSize 的编码技巧,为用户提供无限滚动的体验。WWDC 2011 展示了一个很好的示例,因此如果您有开发者帐户,则可以下载视频(有一个专门用于滚动视图的部分)。或者你可以参考网上的一些例子。当然,您将需要以仅加载需要的内容而不是可以填充可用内存的全部内容的方式重构您的代码。

于 2011-09-22T12:12:16.030 回答
2

据我所知,contentSize在内存不足之前,它的填充没有最大值。

将其视为一个桶,您可以在其中装水,但只有在溢出时才可以。这里的情况也是如此...

因此建议使用UITableView它,因为它具有更好的内置内存管理。

于 2011-09-22T12:01:47.170 回答