2012-03-09 33 views
5

Tôi đang cố triển khai phương thức scrollViewWillBeginDragging. Khi phương pháp này được gọi là tôi kiểm tra xem người dùng đã chọn một trong các nút nằm trong scrollview có ở trạng thái: đã chọn hay không. Nếu không, tôi sẽ hiển thị UIAlert để thông báo cho người dùng.Kiểm tra hướng cuộn trong UIScrollView

Vấn đề của tôi ở đây là tôi chỉ muốn gọi nút chọn (NextQuestion) phương pháp nếu người dùng cuộn từ phải sang trái (kéo xem tiếp theo từ bên phải). Nhưng nếu chúng đang di chuyển từ Trái sang phải thì tôi muốn nó cuộn như bình thường.

Hiện tại, phương pháp kiểm tra được gọi là bất kể hướng người dùng cuộn vào. Làm cách nào tôi chỉ có thể gọi một phương thức khi họ cuộn từ Phải sang trái?

Dưới đây là làm thế nào tôi đã hiện thực hiện nó:

- (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]; 
    } 
} 

Mã cho Giải pháp 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

Hãy nhìn vào câu trả lời này: http://stackoverflow.com/a/4073028/742298 –

Trả lời

0

Thực hiện một CGFloat lastOffset như một member variable trong class.h tập tin của bạn. .

rồi đặt số 0 trong viewDidLoad.

sau đó kiểm tra trong

 - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView 

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

} 
+0

Thật không may điều này không làm việc. Trình gỡ lỗi hiển thị nó để bỏ qua câu lệnh If. Tôi đã đặt lastOffset thành 0 trong ViewDidLoad. Và ý tưởng? – HGomez90

+0

NSLog scrollView.contentOffset.x ngay trước khi câu lệnh ..nó phải là tiêu cực cho việc cuộn trái – Shubhank

+0

Cuộn Phải sang trái cho thấy scrollview.contentOffset.x tại '0.000000' . Trái sang phải cho thấy nó tại '768.000000' – HGomez90

0

Bạn có thể giữ một offset bắt đầu như một thành viên của lớp học của bạn mà bạn lưu trữ khi các đại biểu nhận scrollViewDidBeginDragging: Thông điệp. Khi bạn có giá trị đó, bạn có thể so sánh giá trị x của bù trừ chế độ xem cuộn với giá trị bạn đã lưu trữ và xem liệu chế độ xem đã được kéo sang trái hay phải.

Nếu thay đổi hướng giữa kéo là quan trọng, bạn có thể đặt lại điểm so sánh của mình trong phương pháp đại biểu chế độ xemDidScroll:. Vì vậy, một giải pháp hoàn chỉnh hơn sẽ lưu trữ cả hai hướng phát hiện cuối cùng và điểm bù gốc và cập nhật trạng thái mỗi khi khoảng cách hợp lý đã được kéo.

- (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; 
    } 
} 

Khoảng cách hợp lý là bất cứ điều gì bạn cần để ngăn hướng di chuyển lật giữa trái và phải dễ dàng nhưng khoảng 10 điểm là đủ.

21

Trong scrollViewWillBeginDragging xem di chuyển vẫn chưa di chuyển (hoặc đăng ký di chuyển) và vì vậy contentOffset sẽ bằng 0. Tính đến IOS 5 bạn có thể thay vì nhìn vào scrollview của panGestureRecognizer để xác định hướng và tầm quan trọng của cử chỉ di chuyển của người dùng.

- (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

** Lưu ý, bản dịch có thể trở về 0 nếu cử chỉ quá tinh tế. ** Sử dụng '' 'CGPoint velocity = [scrollView.panGestureRecognizer velocityInView: scrollView.superview]; '' 'thay thế. – Robert

+0

Ngoài ra lưu ý, nếu bạn flick một UIScrollView và sau đó chạm và giữ trong khi xem vẫn giảm tốc, scrollViewWillBeginDragging sẽ được gọi với dịch và vận tốc cả hai có x = y = 0. Vì vậy tốt hơn không cho rằng '' 'else {...} '' 'sẽ là' '' kéo left'''. Kiểm tra các giá trị dịch/tốc độ bằng không để chắc chắn. – Robert

Các vấn đề liên quan