【问题标题】:Limit UITableView scroll speed like Instagram does it像 Instagram 一样限制 UITableView 的滚动速度
【发布时间】:2015-08-26 14:19:27
【问题描述】:

我正在尝试限制 UITableView 的滚动速度,就像 Instagram 所做的那样。

如果您查看 Instagram,您会注意到它们对您滚动浏览提要的速度有限制。

没有使用“decelerationRate”设置,因为限制不影响减速度。它只会影响您滚动浏览提要的速度。所以如果你尝试做一个“轻弹”手势,你会达到 Instagram 的最大滚动速度,并且不会像普通 UITableView 那样快。

你猜猜 Instagram 是如何做到这一点的?

【问题讨论】:

  • 您为什么认为 Instagram 做了一些特别的事情?当我尝试复制时,我没有遇到任何滚动速度限制。
  • @thelaws 它肯定会以某种方式滚动得更慢。当您像往常一样滚动浏览提要并尝试在另一个应用程序中滚动浏览另一个提要时,Instagram 似乎更加流畅。
  • 看起来很流畅,但一点也不慢。
  • @k06a 那么平滑...我仍然会说它有点慢。但我想你得到的一般感觉是它很流畅。他们是怎么做到的?
  • 我同意它根本没有放慢速度,但我认为“平滑”是指滚动时没有跳帧的感觉。如果是这种情况,那么可能是将尽可能多的加载逻辑移动到后台线程以允许主线程尽可能接近 60fps 渲染的问题。 Instagram 有一个相对简单的表格单元设置(一个图像、一些文本、几个按钮)。如果您在滚动时感觉“断断续续”,我建议您搜索一下如何在后台线程中加载图像和其他内容。

标签: ios objective-c uitableview uiscrollview


【解决方案1】:

TableView有一个属性scrollView,这个属性会返回TableView内部的scrollView。使用以下...

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

希望对你有所帮助...

【讨论】:

  • 感谢您的回答。我很确定它不会工作。 “decelerationRate”只是控制减速,所以绝对行不通。将点设置为使用动画手动滚动也不起作用。当它只是一个动画时,用户不会有减速的感觉。还有其他选择吗?
  • 试着看一下 instagram 并尝试轻弹主提要,你会看到我想要什么。
  • 试试这两个选项,我使用了第二个选项,它对我很有效。尝试此选项只需 5 分钟。
  • 你能用 Swift 发布这个吗?我急需解决方案。
  • @NiravGadhiya scrollViewDidScroll 只有这个方法可以快速滚动吗?
【解决方案2】:

使用这个:

self.tableview.scrollView.decelerationRate = UIScrollViewDecelerationRateFast;

由于 tableView 是 UIScrollView 的子类,因此 ScrollView 委托将在这里工作。希望这会有所帮助.. :)

编辑:

如果 tableView 不显示 scrollView 属性使用:

self.tableView.decelerationRate

【讨论】:

  • 感谢您的回答。 “decelerationRate”只是控制减速率,与一般速度无关,所以不起作用。查看 Instagram 并尝试轻弹主要提要,您会看到我在追求什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-11
  • 2012-09-30
  • 2018-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多