UIScrollView отключить прокрутку при вращении на iPhone / iPad - PullRequest
18 голосов
/ 08 ноября 2010

Я использую UIScrollView и изображение в нем, как постраничное изображение на страницу.У меня проблема при повороте iPhone

Когда я поворачиваю iPhone, вызывается scrollViewDidScroll (метод делегирования с прокруткой).Из-за этого мой пейджинг нарушается, и номер страницы меняется.

Какое решение?

Ответы [ 4 ]

23 голосов
/ 15 ноября 2011

Ответ Рафаэля - отличное описание проблемы и аккуратное решение.У меня была точно такая же проблема, и в итоге я установил флаг scrollingLocked, для которого я установил YES (заблокирован) перед началом вращения, и NO (разблокирован), когда он закончился.Возможно, чуть менее взломанный, чем временное изменение contentSize:

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)orientation
                                duration:(NSTimeInterval)duration
{
    self.photoViewer.scrollingLocked = YES;
}

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromOrientation
{
    self.photoViewer.scrollingLocked = NO;
}

- (void)scrollViewDidScroll:(UIScrollView*)scrollView
{
    if (self.scrollingLocked)
    {
        return;
    }
    /* do normal scrollViewDidScroll: stuff */
}
14 голосов
/ 24 февраля 2011

Я обнаружил странное недокументированное поведение при вращении постраничного UIScrollView.

Когда представление прокрутки располагается на последней странице и пользователь меняет ориентацию, ОС прокручивает UIScrollView несколько пикселей назад.чтобы компенсировать разницу между высотой и шириной.

В основном я получил следующие вызовы для любой страницы.

willRotateToInterfaceOrientation:duration
willAnimateRotationToInterfaceOrientation:duration:
didRotateFromInterfaceOrientation:

И для последней страницы:

willRotateToInterfaceOrientation:duration
scrollViewDidScroll:
willAnimateRotationToInterfaceOrientation:duration:
didRotateFromInterfaceOrientation:

Это перепуталось и с моими страницами.Проблема в том, что в willRotate границы еще не обновлены ОС, а в willAnimate у вас есть новые границы и вы можете вычислить новый размер, но уже слишком поздно ...

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

    CGSize tempSize = [self.pagingScrollView contentSize];
    NSUInteger padding = abs(pagingScrollView.frame.size.width - pagingScrollView.frame.size.height);
    tempSize.width += padding;
    [self.pagingScrollView setContentSize:tempSize];
    [...]
}
- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation duration:(NSTimeInterval)duration{
    CGSize newSize = ... // Compute new content size based on new orientation
    [self.pagingScrollView setContentSize:newSize];
}

Это просто обходной путь, но я потратил бесчисленные часы на эту проблему и не смог найти элегантного решения.

0 голосов
/ 27 августа 2013

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

-(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration{
    [self.scrollView setContentSize:CGSizeMake(self.scrollView.contentSize.width + 400, self.scrollView.contentSize.height)];
}

И убедитесь, что вы установили размер и смещение снова после изменения ориентации:

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
{
    [self.scrollView setContentSize:CGSizeMake(self.scrollView.bounds.size.width *3, self.scrollView.bounds.size.height)];
    [self.scrollView setContentOffset:CGPointMake(self.scrollView.bounds.size.width * self.pageControl.currentPage, 0) animated:NO];

}
0 голосов
/ 26 августа 2012

Моя задача - разрешить прокрутку ландшафта.Дизайн для портрета.У меня возникла идея добавить ScrollView к компонентам или в «Вставить в Scroll View» в Interface Builder .Я ожидал, что это сработает, но нет.Я использую Xcode 4.4, iOS 5.1 (офисный проект тоже нуждается в поддержке 4.2), но проблема та же.

В вопросе переполнения стека iPhone SDK: UIScrollView не прокручивает есть одна строка, которая решает проблему.

Другая попытка находится в вопросе переполнения стека iOS - UIScrollView не работает (не работаетпрокрутка на всех - изображение остается фиксированным) , и это помогло мне, в сочетании с другими, так что вот мой ландшафтный код с возможностью прокрутки:

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromOrientation
{ 
    if( UIInterfaceOrientationIsPortrait( [[UIApplication sharedApplication] statusBarOrientation] ) ){
        scrollView.contentSize = portaitScrollSize;
    }
    else{//statusbar is Landscape
        scrollView.contentSize = landscapeScrollSize;
    }    
}

ScrollView в ограниченном видев представлении iVar в Интерфейсном Разработчике.portaitScrollSize и landscapeScrollSize являются приватными переменными.Они инициализируются и не меняются.В my.h файле:

IBOutlet UIScrollView *scrollView;

В my.m файле:

CGSize portaitScrollSize, landscapeScrollSize;

...

portaitScrollSize = CGSizeMake(320,440);
landscapeScrollSize = CGSizeMake(480,480);

Надеюсь, это поможет кому-нибудь добавитьфункция прокрутки + прокрутки к дизайну портретов.

Не забудьте разрешить портрет + пейзаж на верхнем компоненте :

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return TRUE;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...