像Instagram一样限制UITableView滚动速度

Hol*_*bæk 18 objective-c uitableview uiscrollview ios

我试图限制我的UITableView的滚动速度,就像Instagram一样.

如果您查看Instagram,您会发现他们对滚动浏览Feed的速度有限制.

它没有使用"减速率"设置,因为限制不会影响减速度.它只会影响您滚动Feed的速度.因此,如果您尝试执行"轻弹"手势,您将达到Instagrams最大滚动速度,并且不会像普通UITableView那样快.

有关Instagram如何实现这一点的任何猜测?

Nir*_*iya 15

TableView有一个属性scrollView,该属性将返回TableView的内部scrollView.使用以下......

tableview.scrollView.decelerationRate = UIScrollViewDecelerationRateFast;
Run Code Online (Sandbox Code Playgroud)

其他方式:

TableView将响应scrollView委托,因此我们需要实现scrollView的委托,如:

拿这些全局变量:

CGPoint lastOffset;
NSTimeInterval lastOffsetCapture;
BOOL isScrollingFast;
Run Code Online (Sandbox Code Playgroud)

实施scrollViewDidScroll如下:

- (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;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后scrollViewDidEndDragging像这样实现:

- (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];
    }
}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助你......


Ras*_*had 8

用这个:

self.tableview.scrollView.decelerationRate = UIScrollViewDecelerationRateFast;
Run Code Online (Sandbox Code Playgroud)

由于tableView是UIScrollView的子类,因此ScrollView委托将在此处运行.希望这可以帮助.. :)

编辑:

如果tableView没有显示scrollView属性使用:

self.tableView.decelerationRate
Run Code Online (Sandbox Code Playgroud)