2012-03-09 3 views
5

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

Моя проблема здесь я только хочу, чтобы вызвать выбранную кнопку (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]; 
    } 
} 
+0

Посмотрите на этот ответ: http://stackoverflow.com/a/4073028/742298 –

ответ

0

Сделать 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]; 
    } 

} 
+0

К сожалению, это не сработало. Отладчик покажет ему, чтобы пропустить этот оператор If. Я установил lastOffset в 0 в ViewDidLoad. И идеи? – HGomez90

+0

NSLog scrollView.contentOffset.x как раз перед тем, если инструкция ..он должен быть отрицательным для левой прокрутки – Shubhank

+0

Прокрутка вправо налево показывает scrollview.contentOffset.x в '0,000000' . Слева направо показывает его на '768.000000' – HGomez90

0

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

Если переменное направление перетаскивания важно, вы можете сбросить свою сравнительную точку в методе делегата 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 баллов должно быть около достаточно.

21

В scrollViewWillBeginDragging виде прокрутки еще не перемещается (или зарегистрировал движение) и так contentOffset будете на 0. По IOS 5 вы можете вместо этого смотреть в Scrollview-х 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 
    } 
} 
+5

** Обратите внимание, что перевод может возвращать ноль, если жест слишком тонкий. ** Использовать '' 'CGPoint velocity = [scrollView.panGestureRecognizer speedInView: scrollView.superview]; '' 'вместо этого. – Robert

+0

Кроме того, обратите внимание, что если вы щелкнете UIScrollView, а затем коснитесь и удерживайте, пока вид все еще замедляется, scrollViewWillBeginDragging будет вызываться с переводом и скоростью, имеющей x = y = 0. Поэтому лучше не предполагать, что '' else {...} '' '' '' перетаскивание влево'''. Убедитесь, что значения перевода/скорости равны нулю. – Robert