我正在开发一款带有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);
}
}
答案 0 :(得分:3)
我建议使用无限滚动视图来使用此类应用程序。这包括基于固定(和有限)contentSize的编码技巧,为用户提供无限滚动的体验。 在WWDC 2011上已经展示了一个很好的例子,所以如果你有一个开发者帐户,你可以下载视频(有一个专门用于滚动视图的部分)。 或者您可以参考网络上的一些示例。 当然,您需要以只加载所需内容的方式重构代码,而不是整个内容可以填充可用内存。
答案 1 :(得分:2)
据我所知,contentSize
没有最大值,直到你的内存耗尽为止。
将它视为一个可以填充水的桶,但只能溢出。情况就是这样......
因此建议使用UITableView
,因为它具有更好的内置内存管理功能。