Я разрабатываю небольшое приложение для iPad с диаграммой Ганта, которая покажет события за последние 25 часов. У меня есть 5 уровней масштабирования на 1 час, 30 минут, 15 минут, 5 минут и 1 минуту. Мои ячейки имеют ширину 30 пикселей. Начиная с почасового Zoomlevel у меня есть 25 * 30 пикселей = 750 ширины для контента (пока нет необходимости прокручивать). При масштабировании ширина ячейки остается прежней, просто будет больше ячеек, и я могу прокручивать по горизонтали. Он отлично работает на 30, 15 и 5 минут. Когда дело доходит до 1-минутного уровня (ширина 45000 пикселей (30 * 1500), все начинает идти не так. Прокрутка зависает (я все еще могу прокручивать, но дисплей не обновляется).
drawRect: был пройден (так что он должен был быть нарисован правильно). Я вижу небольшую полосу прокрутки на кнопке (она даже доходит до конца). Поэтому я попытался осторожно относиться к ширине и, похоже, проблемы начинаются примерно с 16300 ширина пикселя. Есть ли способ обойти это? Или какое-либо решение?
Я использую ScrollView с включенным uiview (Ganttchartview), который 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);
}
}