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