Проверьте направление прокрутки в UIScrollView - PullRequest
5 голосов
/ 09 марта 2012

Я пытаюсь реализовать метод scrollViewWillBeginDragging. Когда этот метод вызывается, я проверяю, что пользователь выбрал одну из кнопок, которые в пределах прокрутки находится в состоянии: выбран.Если нет, то я отображаю UIAlert для информирования пользователя.

Моя проблема здесь в том, что я хочу вызывать метод выбранной кнопки ( NextQuestion ), только если пользователь прокручивает от вправовлево (вытягивая следующий вид справа).Но если они прокручиваются от влево * вправо , тогда я хочу, чтобы он прокручивался как обычно.

В настоящее время метод проверки вызывается независимо от того, в каком направлении прокручивается пользователь. Как я могу тольковызовите метод при прокрутке с Справа на лево ?

Вот как я сейчас реализовал это:

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
    [self NextQuestion:scrollView];
}

-(IBAction)NextQuestion:(id)sender
{
    CGFloat pageWidth = scrollView.frame.size.width;
    int page = floor((scrollView.contentOffset.x - pageWidth) / pageWidth) + 1;
    NSInteger npage = 0;
    CGRect frame = scrollView.frame;

    // Check to see if the question has been answered. Call method from another class.
    if([QuestionControl CheckQuestionWasAnswered:page])
    {
        pageNumber++;

        NSLog(@"Proceed");
       if(([loadedQuestionnaire count] - 1) != page)
       {
           [self loadScrollViewWithPage:page - 1];
           [self loadScrollViewWithPage:page];
           [self loadScrollViewWithPage:page + 1];
       }

       // update the scroll view to the appropriate page
       frame = scrollView.frame;
       frame.origin.x = (frame.size.width * page) + frame.size.width;
       frame.origin.y = 0;
       [self.scrollView scrollRectToVisible:frame animated:YES];

   }

   // If question has not been answered show a UIAlert with instructions.
   else
   {
       UIAlertView *alertNotAnswered = [[UIAlertView alloc] initWithTitle:@"Question Not Answered" 
                                                                 message:@"You must answer this question to continue the questionnaire." 
                                                                delegate:nil 
                                                       cancelButtonTitle:@"OK" 
                                                       otherButtonTitles:nil, nil];
       [alertNotAnswered show];
   }
} 

Код для решения 1:

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
    NSLog(@"%f",scrollView.contentOffset.x);
    if (scrollView.contentOffset.x < lastOffset) // has scrolled left..
    {
        lastOffset = scrollView.contentOffset.x;
        [self NextQuestion:scrollView];
    }
}

Ответы [ 3 ]

21 голосов
/ 17 октября 2013

В scrollViewWillBeginDragging представление прокрутки еще не переместилось (или не зарегистрировало перемещение), поэтому contentOffset будет равно 0. Начиная с IOS 5, вместо этого вы можете посмотреть в panGestureRecognizer прокрутки, чтобы определить направление и величинужест прокрутки пользователя.

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{ 
    CGPoint translation = [scrollView.panGestureRecognizer translationInView:scrollView.superview];

    if(translation.x > 0)
    {
        // react to dragging right
    } else
    {
        // react to dragging left
    }
}
0 голосов
/ 10 марта 2012

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

При изменении направления в серединеперетаскивание важно, вы можете сбросить вашу сравниваемую точку в viewDidScroll: метод делегата.Таким образом, более полное решение будет хранить как последнее обнаруженное направление, так и базовую точку смещения и обновлять состояние при каждом перетаскивании разумного расстояния.

- (void) scrollViewDidScroll:(UIScrollView *)scrollView
{
    CGFloat distance = lastScrollPoint.x - scrollView.contentOffset.x;
    NSInteger direction = distance > 0 ? 1 : -1;
    if (abs(distance) > kReasonableDistance && direction != lastDirection) {
        lastDirection = direction;
        lastScrollPoint = scrollView.contentOffset;
    }
}

«Разумное расстояние» - это то, что вам нужно предотвратитьнаправление прокрутки для легкого переключения между левым и правым, но примерно 10 точек должно быть достаточно.

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

Создайте CGFloat lastOffset как member variable в вашем class.h файле ..

, затем установите 0 в viewDidLoad.

, затем проверьтев

        - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView

    {
    if (scrollView.contentOffset.x < lastOffset) // has scrolled left..
    {
         lastOffset = scrollView.contentOffset.x;
        [self NextQuestion:scrollView];
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...