contentOffset UIScrollView во время вращения - PullRequest
6 голосов
/ 05 сентября 2010

Я хочу вручную обновить contentOffset из UIScrollView во время изменений поворота.Представление прокрутки заполняет экран и имеет гибкую ширину и гибкую высоту.

В настоящее время я пытаюсь обновить contentOffset в willRotateToInterfaceOrientation, например так:

- (void) willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
    [Utils logPoint:myScrollView.contentOffset tag:@"initial"];
    myScrollView.contentOffset = CGPointMake(modifiedX, modifiedY);
    [Utils logPoint:myScrollView.contentOffset tag:@"modified"];
}

-(void) didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation {
    [Utils logPoint:myScrollView.contentOffset tag:@"final"];
}

Однако окончательный вариантзначение не является измененным значением, и на него это как бы влияет, но мне не ясно, как.

Вот некоторые из результатов, которые я получаю:

initial: (146.000000;-266.000000)
modified: (81.000000;-108.000000)
final: (59.000000;-0.000000)

initial: (146.000000;-266.000000)
modified: (500.000000;500.000000)
final: (59.000000;500.000000)

initial: (146.000000;-266.000000)
modified: (-500.000000;-500.000000)
final: (-0.000000;-0.000000)

Как обновить contentOffset представления прокрутки во время изменения поворота?

Ответы [ 3 ]

12 голосов
/ 12 сентября 2010

Преобразование моего комментария в ответ:)

Попробуйте вместо этого изменить contentOffset из willAnimateRotationToInterfaceOrientation:duration:.К тому времени блок анимации должен быть на месте, и ОС рассматривает ваши изменения в contentOffset как принадлежащие изменениям, вызванным ротацией.

Если вы ранее изменили contentOffset, похоже, что система их не уважаетизменяется как принадлежащий вращению, и все еще применяет изменение размера вращения, на этот раз начиная с ваших новых измерений.

4 голосов
/ 15 апреля 2013

Следующие фрагменты работают, когда подкачка включена в UIScrollView и смещение страницы должно сохраняться.

Объявите свойство, которое будет вычислять позицию currentPage перед вращением, и установите его в -1 в viewDidLoad

@property (assign, nonatomic) NSInteger lastPageBeforeRotate;

Затем переопределите метод willRotateToInterfaceOrientation:toInterfaceOrientation:duration и присвойте ему вычисленное значение.

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
    int pageWidth = self.scrollView.contentSize.width / self.images.count;
    int scrolledX = self.scrollView.contentOffset.x;
    self.lastPageBeforeRotate = 0;

    if (pageWidth > 0) {
        self.lastPageBeforeRotate = scrolledX / pageWidth;
    }

    [self showBackButton:NO];
}

Затем мы гарантируем, что перед выполнением поворота мы правильно установим смещение содержимого нашего прокрутки, чтобы сфокусировать его на lastPageBeforeRotate

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
        if (self.lastPageBeforeRotate != -1) {
            self.scrollView.contentOffset = CGPointMake(self.scrollView.bounds.size.width * self.lastPageBeforeRotate, 0);
            self.lastPageBeforeRotate = -1;
        }
}
3 голосов
/ 14 октября 2015

Обновленный ответ для iOS 8 +

Реализация viewWillTransitionToSize: withTransitionCoordinator: в вашем контроллере.

Пример:

-(void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator {
    NSUInteger visiblePage = (NSInteger) self.scrollView.contentOffset.x / self.scrollView.bounds.size.width;

    [coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext>  _Nonnull context) {
        self.scrollView.contentOffset = CGPointMake(visiblePage * self.scrollView.bounds.size.width, self.scrollView.contentOffset.y);
    } completion:nil];
}
...