我正试图限制我的UITableView的滚动速度,就像Instagram一样。
如果您查看Instagram,您会发现他们对滚动Feed的速度有限制。
没有使用“减速率”设置,因为限制不会影响减速度。它只会影响您滚动Feed的速度。因此,如果您尝试执行“轻弹”手势,您将达到Instagrams最大滚动速度,并且不会像普通UITableView那样快。
有关Instagram如何实现这一点的任何猜测?
答案 0 :(得分:15)
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];
}
}
希望这可以帮助你...
答案 1 :(得分:8)
使用此:
self.tableview.scrollView.decelerationRate = UIScrollViewDecelerationRateFast;
由于tableView是UIScrollView的子类,ScrollView委托将在这里工作。希望这有助于.. :))
修改强>
如果tableView没有显示scrollView属性,请使用:
self.tableView.decelerationRate