Ограничьте скорость прокрутки UITableView, как это делает Instagram

Я пытаюсь ограничить скорость прокрутки моего UITableView, точно так же, как это делает Instagram.

Если вы проверите Instagram, вы заметите, что у них есть ограничение на то, как быстро вы можете прокручивать фид.

Он не устанавливается с использованием параметра "decelerationRate", поскольку предел не влияет на замедление. Это просто влияет на скорость прокрутки канала. Поэтому, если вы попытаетесь сделать жест "flick", вы получите максимальную скорость прокрутки Instagrams max и не пойдет так же быстро, как в обычном UITableView.

Любые догадки о том, как это делает Instagram?

Ответ 1

TableView имеет свойство scrollView. Это свойство вернет внутренний scrollView TableView. Используйте следующие...

tableview.scrollView.decelerationRate = UIScrollViewDecelerationRateFast;

ДРУГОЙ ПУТЬ:

TableView будет отвечать делегату scrollView, поэтому нам нужно реализовать делегат scrollView, например:

Возьмите эти глобальные переменные:

CGPoint lastOffset;
NSTimeInterval lastOffsetCapture;
BOOL isScrollingFast;

Внедрить 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;
    }
}

Затем выполните 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];
    }
}

Надеюсь, это поможет вам...

Ответ 2

Используйте это:

self.tableview.scrollView.decelerationRate = UIScrollViewDecelerationRateFast;

Поскольку tableView является подклассом UIScrollView, делегат ScrollView будет работать здесь. Надеюсь, это поможет..:)

Edit:

если tableView не показывает использование свойства scrollView:

self.tableView.decelerationRate