Nimbus NIPagingScrollView и изменение макета при вращении

Я использую NIPagingScrollView для отображения нескольких страниц на iPhone.

Каждый раз, когда я перелистываю страницу, следующая страница также предварительно загружается, и это нормально.

Когда я поворачиваю iPhone из портретного режима в ландшафтный, я позволяю layoutSubviews выполнять переразметку в моем подклассе NIPageView. NIPagingScrollView автоматически растягивается по ширине и высоте, чтобы оставаться в полноэкранном режиме. Это работает для текущей страницы.

Но когда я перелистываю на следующую страницу, макет нарушается, так как он был предварительно загружен ранее, а также автоматическим вызовом layoutSubviews.

Я предполагаю, что происхождение не обновляется прямо на следующей странице при ротации или что-то в этом роде.

Есть ли у кого-нибудь намек на то, как я могу избежать этой проблемы (кроме того, чтобы не использовать альбомную ориентацию)? И это баг в Nimbus?

EDIT: я обнаружил, что NIPagingScrollView предоставляет методы willRotateToInterfaceOrientation:duration: и willAnimateRotationToInterfaceOrientation:duration:, которые должны вызываться контроллером представления. Я реализовал эти вызовы, но все равно не помогает.


person fabb    schedule 28.01.2012    source источник


Ответы (1)


Действительно, NIPagingScrollView предоставляет эти методы, но если вы посмотрите на них, вы увидите, что вычисления макета основаны на значениях фрейма прокрутки.

Поэтому, если вы хотите, чтобы вашему представлению прокрутки страниц были присвоены правильные значения, например, фрейм или ваше основное представление (представление контроллера) для представления прокрутки страниц (в примере _scrollView).

Таким образом, непосредственно перед анимацией ваше представление прокрутки страниц будет иметь правильный ожидаемый кадр, и ваш макет будет правильно пересчитан.

- (void)willAnimateRotationToInterfaceOrientation: (UIInterfaceOrientation)toInterfaceOrientation
                                     duration: (NSTimeInterval)duration {

    // Your missing line of code to set the scroll view frame values
    [self->_scrollView setFrame:self.view.bounds];

    [self->_scrollView willAnimateRotationToInterfaceOrientation: toInterfaceOrientation
                                                        duration: duration];

    [super willAnimateRotationToInterfaceOrientation: toInterfaceOrientation
                                            duration: duration];

}
person Vaseltior    schedule 19.02.2012
comment
Спасибо за этот совет, я попробую это в следующий раз, когда буду работать над этим кодом! - person fabb; 20.02.2012