UIScrollView предотвращает прокрутку в одном направлении независимо от contentSize / Offset - PullRequest
3 голосов
/ 28 сентября 2011

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

Например, кто-то может передаватьвыполните тестирование с десятью вопросами (по одному вопросу на страницу), но прокрутка не будет работать, если человек не ответил на вопрос на текущей странице.

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

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

Полагаю, я мог бы "поиграть" с размером / смещением контента и обновить его на каждой странице, но я не уверен, как это сделать правильно, так как у меня также есть "ссылки", которые могут позволить кому-то прыгать содна страница на другую (которая может быть в то время за пределами определенного содержимого).

Я пробовал использовать пользовательское представление для страниц, где перелистывание в определенном направлении заблокировано, но оно не работает, так как я не могНайдите способ предотвратить прокручивание вида прокрутки, не затрагивая страницы, если перелистывание должно работать в обычном режиме.Я увидел, что могу установить для этого пользовательского свойства exclusiveTouch значение YES, и предположил, что, поскольку он собирался получать все события, я мог обрабатывать пролистывания с помощью пользовательских распознавателей жестов и пересылать события, если свипирование было разрешено, или игнорировать их, если нет.Это не сработало, ScrollView всегда отлавливает события смахивания.

Я чувствую, что исчерпал все возможности и не могу найти никого, у кого были похожие потребности.

Так что мне интересно, возможно ли это??Если да, потребуются ли плохие хаки или создание нового пользовательского вида прокрутки?

Любая помощь / идея будет принята с благодарностью.

Ответы [ 2 ]

1 голос
/ 28 сентября 2011

используйте ваше условие в соответствующем месте в вашем коде, где вы хотите заблокировать прокрутку / пейджинг и установите для pagingEnabled или scrollEnabled вашего объекта scrollView значение NO.

EDIT:

Должен был прочитать ваше требование более внимательно. Для ваших нужд лучшим решением было бы использовать несколько видов слайдов в зависимости от ваших условий. Оживи их. Распознаватели жестов также должны помочь. И я не говорю о scrollView здесь. View1 -> условие -> проходит? (действие кнопки или жест) -> анимация в view2 и так далее.

Если вам действительно нужно использовать scrollView, лучшее, что вы можете сделать, - это установить для contentSize ширину экрана и установить AlwaysBounceHor horizontal на NO, чтобы предотвратить эффект автоматического подпрыгивания:

CGRect size = scrollView.contentSize;
size.width = CGRectGetWidth(scrollView.frame);
scrollView.contentSize = size;
scrollView.alwaysBounceHorizontal = NO;
0 голосов
/ 07 мая 2013

Нашел в другом посте, вот как я решил ту же проблему, что и у меня.

Поместите это в свой контроллер представления и установите его в качестве делегата UIScrollView

CGPoint oldOffset;  // instance variable

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
    oldOffset = scrollView.contentOffset;
}

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    if (scrollView.contentOffset.x < oldOffset.x) 
    {
        [scrollView setContentOffset:oldOffset];
    }
}
...