2011-10-19 34 views
5

Có ai biết cách xác định hướng mà chế độ xem cuộn sẽ di chuyển khi người dùng nhấc ngón tay lên, tức là khi scrollViewDidEndDragging được gọi?UIScrollView xác định hướng cuộn trên scrollViewDidEndDragging khi phân trang

Cụ thể, khi chế độ xem cuộn được đặt thành phân trang.

Hầu hết thời gian, tôi chỉ có thể theo dõi và kiểm tra contentOffset trong scrollViewDidScroll, tuy nhiên, có những trường hợp đặc biệt khi người dùng bung nhanh màn hình. Trong một số trường hợp, thao tác LEFT-RIGHT-LEFT sẽ di chuyển đến trang tiếp theo và trong các trường hợp khác, cùng một mẫu sẽ vẫn nằm trên cùng một trang.

Tôi đoán nó có một cái gì đó để làm với khả năng tăng tốc (sự khác biệt giữa các điểm cuối cùng) của liên lạc.

(Tôi đang trên iOS4.3 trên iPad)

Trả lời

1

Đây là một khó khăn, iOS 5 có answer, nhưng điều đó không tốt cho bạn.

Có lẽ cách giải quyết hacky là đặt NSTimer trong khoảng thời gian nhỏ (nói 0,1 giây) sau khi hoàn thành scrollViewDidEndDragging. Sau đó so sánh độ lệch nội dung.

Nếu bạn muốn biết liệu chế độ xem cuộn có thực sự chuyển đến trang tiếp theo hay không, có lẽ bạn có thể kiểm tra xem độ lệch nội dung có lớn hơn 1/2 cách hay không. Bạn có thể đọc nội dung bù đắp trên scrollViewDidScroll: và thực hiện một số phép tính để xác định xem nó có hơn 1/2 cách hay không.

+0

Câu trả lời iOS 5 trông giống như giải pháp .... ngoại trừ không được gọi khi phân trang được bật! Tôi đã nghĩ về cách tiếp cận hẹn giờ nhưng tôi đã hy vọng cho một giải pháp ít hacky. Tôi có thể thử và làm việc xung quanh nó theo một cách khác, nếu không tôi sẽ đưa ra phương pháp hẹn giờ. Cảm ơn – Rob

3

Bạn không sử dụng bộ hẹn giờ, hoạt động rất tốn kém. Khóa hướng cuộn của bạn trước tiên để di chuyển chỉ lên/xuống và trái/phải [Tôi đoán đó là những gì bạn muốn]. Và sau đó sử dụng đoạn mã sau để xác định ...

CGPoint start, end; 

- (void)scrollViewWillBeginDragging:(UIScrollView *)sender { 
    start = self.scrollView.contentOffset; 
} 

- (void)scrollViewDidEndDragging:(UIScrollView *)sender willDecelerate:(BOOL)decelerate { 
    end = self.scrollView.contentOffset; 
} 

- (void)scrollViewDidEndDecelerating:(UIScrollView *)sender {  
    NSLog(@"%d %d",(int)start.x,(int)start.y); 
    NSLog(@"%d %d",(int)end.x,(int)end.y); 
} 
+0

nếu người dùng đã kéo 2cm sang phải và sau đó 1cm sang bên trái .. nó sẽ đưa ra hướng sai, phải không? – Daniel

2

Đây là giải pháp của tôi hoạt động tốt cho tôi hy vọng nó sẽ giúp

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView { 

    CGFloat pageWidth = scrollView.frame.size.width; 

    //Old Solution 
    //Switch the indicator when more than 30% of the previous/next page is visible 
    //You can vary the percentage 
    //int page = floor((scrollView.contentOffset.x - pageWidth * 0.3)/pageWidth) + 1; 


    //New Solution 
    _pageControl.currentPage = (int)scrollView.contentOffset.x/(int)pageWidth; 
} 

tôi bỏ giải pháp cũ như cái mới dường như mượt hơn

+0

Các giải pháp cũ là tốt, nó là tiện dụng, khi có hoàn toàn 31 tế bào và 5 tế bào được hiển thị trên mỗi trang. Vì vậy, trang cuối cùng sẽ hiển thị các ô từ chỉ mục đến 26 đến 30. (chỉ mục 30 có nghĩa là nó là ô thứ 31). Trong trường hợp này, hệ số nhân của tôi sẽ là 1/5 (vì có 5 ô trên một trang) – user1046037

0

Ngoài phản ứng saurin. cô làm việc tốt giải pháp nhưng nếu bạn đang sử dụng pagination và em ở cuối kích thước nội dung cuộn bạn sẽ phải kiểm tra nếu chúng ta thực sự có một cuộn để các 'trang' bên cạnh hay không:

CGPoint start, end; 

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

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate 
{ 
    end = scrollView.contentOffset; 
} 

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView 
{ 
    if (start.x > end.x && end.x>0) 
    { 
     NSLog(@"on the previous left page"); 
    } 

    if (start.x < end.x && end.x < scrollView.contentOffset.x) 
    { 
     NSLog(@"on the next right page"); 
    } 
} 
+0

Nếu người dùng cuộn zigzag thì dừng lại khi di chuyển sang phải sau khi bắt đầu nhiều hơn một chút so với vị trí thực tế nó sẽ đưa ra kết quả sai.Luôn luôn làm "thử nghiệm khỉ điên" khi thử nghiệm một giao diện;) –

2

Thực hiện theo phương thức UIScrollViewDelegate. Bạn có thể so sánh bù đắp nội dung hiện tại và targetContentOffset sau đó lấy hướng.

-(void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset{ 

    CGPoint newOffset = CGPointMake(targetContentOffset->x, targetContentOffset->y); 

    if (newOffset.x > scrollView.contentOffset.x) { 
     NSLog(@"Scrolling direction is left"); 
    }else{ 
     NSLog(@"Scrolling direction is right"); 
    } 

} 
+0

Vận tốc có thể là 0, nó sẽ đặt thành "Đúng" trong các khoảnh khắc sai với giải pháp của bạn. –

+0

Đây là câu trả lời hay nhất – Yitzchak

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