Есть ли максимум для UIScrollView contentSize? - PullRequest
6 голосов
/ 22 сентября 2011

Я разрабатываю небольшое iPad-приложение с Ganttchart, которое будет показывать События за последние 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);
    }
}

Ответы [ 2 ]

3 голосов
/ 22 сентября 2011

Я бы порекомендовал для такого рода приложений использовать бесконечное представление прокрутки. Это заключается в приеме кодирования, основанном на фиксированном (и ограниченном) contentSize, который дает пользователю возможность бесконечной прокрутки. Хороший пример был продемонстрирован на WWDC 2011, поэтому, если у вас есть учетная запись разработчика, вы можете скачать видео (там был раздел, специально посвященный просмотрам прокрутки). Или вы можете обратиться к некоторым примерам в Интернете. Конечно, вам нужно будет реорганизовать ваш код таким образом, чтобы загружался только необходимый контент, а не весь контент, который мог бы заполнить доступную память.

2 голосов
/ 22 сентября 2011

Насколько я знаю, максимума для contentSize нет, он заполняется до тех пор, пока не закончится память.

Рассматривайте это как ведро, где вы можете наполнить водой, но только до тех пор, пока не переполнится.Так же и здесь ...

Так что рекомендуется использовать UITableView, поскольку он имеет лучшее встроенное управление памятью.

...