2015-06-11 17 views
15

Tôi đang cố giới hạn tốc độ cuộn của UITableView, giống như Instagram.Giới hạn tốc độ cuộn UITableView như Instagram hiện nó

Nếu bạn xem Instagram, bạn sẽ nhận thấy rằng chúng có giới hạn về tốc độ bạn có thể cuộn qua nguồn cấp dữ liệu.

Không được đặt bằng cách sử dụng "giảm tốc độ" vì giới hạn không ảnh hưởng đến giảm tốc. Nó chỉ đơn giản ảnh hưởng đến tốc độ bạn có thể cuộn qua nguồn cấp dữ liệu. Vì vậy, nếu bạn cố gắng làm một cử chỉ "flick", bạn sẽ đạt được tốc độ cuộn tối đa của Instagram và sẽ không đi nhanh như trong một UITableView bình thường.

Bất kỳ phỏng đoán nào về cách Instagram thực hiện điều này?

+2

Tại sao bạn nghĩ Instagram đang làm một cái gì đó đặc biệt? Tôi không gặp phải bất kỳ giới hạn tốc độ di chuyển nào khi cố gắng tái tạo. – thelaws

+0

@thelaws nó chắc chắn cuộn chậm nhất bằng cách nào đó. Khi bạn cuộn qua nguồn cấp dữ liệu như bình thường và thử và cuộn qua một nguồn cấp dữ liệu khác trong ứng dụng khác, thì Instagram có vẻ mượt mà hơn nhiều. –

+1

Có vẻ như nó rất mịn, nhưng không hề chậm. – k06a

Trả lời

13

TableView có thuộc tính scrollView, Thuộc tính này sẽ trả về cuộn nội bộView của TableView. Sử dụng sau ...

tableview.scrollView.decelerationRate = UIScrollViewDecelerationRateFast; 

một cách khác:

TableView sẽ trả lời scrollview đại biểu, vì vậy chúng tôi cần phải thực hiện đại diện scrollview của như:

Thực hiện các biến toàn cục:

CGPoint lastOffset; 
NSTimeInterval lastOffsetCapture; 
BOOL isScrollingFast; 

Triển khai scrollViewDidScroll như:

- (void) scrollViewDidScroll:(UIScrollView *)scrollView {  
    CGPoint currentOffset = scrollView.contentOffset; 
    NSTimeInterval currentTime = [NSDate timeIntervalSinceReferenceDate]; 

    NSTimeInterval timeDiff = currentTime - lastOffsetCapture; 
    if(timeDiff > 0.1) { 
     CGFloat distance = currentOffset.y - lastOffset.y; 
     //The multiply by 10,/1000 isn't really necessary....... 
     CGFloat scrollSpeedNotAbs = (distance * 10)/1000; //in pixels per millisecond 

     CGFloat scrollSpeed = fabsf(scrollSpeedNotAbs); 
     if (scrollSpeed > 0.5) { 
      isScrollingFast = YES; 
      NSLog(@"Fast"); 
     } else { 
      isScrollingFast = NO; 
      NSLog(@"Slow"); 
     }   

     lastOffset = currentOffset; 
     lastOffsetCapture = currentTime; 
    } 
} 

Sau đó thực hiện scrollViewDidEndDragging như thế này:

- (void) scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate 
{ 
    if(!decelerate) 
    { 
     NSUInteger currentIndex = (NSUInteger)(scrollView.contentOffset.x/scrollView.bounds.size.width); 

     [scrollView setContentOffset:CGPointMake(scrollView.bounds.size.width * currentIndex, 0) animated:YES]; 
    } 
} 

Hy vọng điều này có thể giúp bạn ...

+0

Cảm ơn câu trả lời. Tôi khá chắc chắn nó sẽ không làm việc mặc dù. "decelerationRate" chỉ kiểm soát việc giảm tốc, do đó chắc chắn sẽ không hoạt động. Đặt điểm để cuộn theo cách thủ công bằng hoạt ảnh sẽ không hoạt động. Người dùng không có cảm giác giảm tốc khi chỉ đơn giản là một hoạt ảnh. Bất kỳ tùy chọn nào khác? –

+0

Hãy thử nhìn vào instagram và cố gắng flick nguồn cấp dữ liệu chính và bạn sẽ thấy những gì tôi đang sau. –

+0

Chỉ cần thử cả hai tùy chọn, tôi đã sử dụng tùy chọn thứ hai và nó đang làm việc cho tôi rất tốt. Chỉ mất 5 phút để thử tùy chọn này. –

5

Sử dụng này:

self.tableview.scrollView.decelerationRate = UIScrollViewDecelerationRateFast; 

Như tableView là một lớp con của UIScrollView, scrollview đại biểu sẽ làm việc ở đây. Hy vọng điều này sẽ giúp .. :)

Edit:

nếu tableView không hiển thị scrollview sử dụng bất động sản:

self.tableView.decelerationRate 
+0

Cảm ơn câu trả lời. "decelerationRate" chỉ cần điều khiển tốc độ giảm tốc và không có gì để làm với tốc độ chung, do đó sẽ không hoạt động. Kiểm tra Instagram và cố gắng flick nguồn cấp dữ liệu chính và bạn sẽ thấy những gì tôi đang sau. –

+0

nó không chấp nhận self.tableview.scrollView – Abhishek

+1

@Abhishek> Xem chỉnh sửa của tôi. – Rashad

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