UIScrollView автоматически прокручивается вверх после SetContentSize во время изменения ориентации - как я могу предотвратить это? - PullRequest
5 голосов
/ 14 апреля 2011

У меня есть UIScrollView, в котором включена только вертикальная прокрутка.Я отображаю сетку кнопок (аналогично сетке изображений для просмотра фотографий).Сетка должна быть нарисована по-разному в зависимости от ориентации экрана, чтобы использовать все пространство экрана.Учитывая размер моих кнопок, я могу разместить по 3 на строку в портретной ориентации и 4 на строку в альбомной.

Я переставляю все кнопки в: willRotateToInterfaceOrientation: duration, а затем вызываю: setContentSize: в моем UIScrollView.Кажется, что все работает нормально, за исключением автоматической прокрутки, которая происходит после вызова SetContentSize :.Другими словами, скажем, я был в портретном режиме и прокручивал 3/4 пути вниз по списку, когда я поворачиваюсь в альбомную ориентацию, он автоматически прокручивает все обратно вверх.

Интересная вещьв том же сценарии, если бы я сделал небольшую прокрутку с прокруткой вверх или вниз, а затем сразу повернул устройство, представление прокрутки перерисовывается правильно и сохраняет текущую позицию прокрутки!

Итак, чтобы бытьЯсно, что виновником здесь является SetContentSize:, но, очевидно, мне нужно вызвать его, чтобы представление прокрутки корректно прокручивалось.

Есть идеи, как сохранить текущую позицию прокрутки?

Спасибо!

Ответы [ 2 ]

1 голос
/ 14 апреля 2011

Вы можете попробовать реализовать метод UIScrollViewDelegate scrollViewShouldScrollToTop:, который сообщает вызывающему абоненту, прокрутить ли вверх или нет.Возможно, вам придется иметь некоторый флаг в вашем делегате, который указывает, идет ли ротация или нет, потому что в обычных условиях вам может потребоваться возможность прикоснуться к строке состояния и прокрутить представление прокрутки вверх.

Если, с другой стороны, вы не хотите, чтобы представление прокрутки автоматически прокручивалось до самого верха, просто реализуйте этот метод делегата и верните NO.

0 голосов
/ 07 марта 2012

У меня была эта проблема, только что сделал это, и она хорошо работает для меня

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
    //calculate percentage down scrollview currently at
    float c = self.scrollView.contentOffset.y / self.scrollView.contentSize.height;

    //reposition subviews in the scrollview
    [self positionThumbnails:toInterfaceOrientation];

    //set the new scrollview offset to the same percentage, 
    // using the new scrollview height to calculate
    self.scrollView.contentOffset = 
          CGPointMake(0, c * self.scrollView.contentSize.height);
}

В моем случае у меня есть прокрутка с фиксированной шириной и размером устройства и переменной высотой

...