UIScrollView contentSize有最大值吗?

时间:2011-09-22 11:48:19

标签: iphone uiscrollview contentsize

我正在开发一款带有Ganttchart的小型iPad应用程序,该应用程序将在过去25小时内显示事件。我有5个缩放级别,分别为1小时30分钟,15分钟,5分钟和1分钟。我的细胞宽度为30像素。从每小时的Zoomlevel开始,我有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);
    }
}

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

据我所知,contentSize没有最大值,直到你的内存耗尽为止。

将它视为一个可以填充水的桶,但只能溢出。情况就是这样......

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