防止UITableView在某个点下滚动

如何让UITableView允许在特定索引行上方滚动,但在低于某一点时阻止它? 例如,如果我有行1到100,其中在给定时间只有5个出现在视图中,我想允许用户在行1-50之间滚动,但是当行50可见时阻止进一步向下滚动。

您可以使用UITableView的属性contentInset 。 只记得用负值设置它们,因为我们缩小了内容大小:

 CGFloat insetTop = topAllowedRow * c_CELL_HEIGHT * -1; CGFloat insetBottom = bottomAllowedRow * c_CELL_HEIGHT * -1; [self.tableView setContentInset:UIEdgeInsetsMake(insetTop, 0, insetBottom, 0)]; 

另一个解决方案是实现UIScrollViewDelegate方法scrollViewDidScroll:scrollView.contentOffset太大时,将其设置回用户可以滚动到的最大值:

 - (void)scrollViewDidScroll:(UIScrollView*)scrollView { CGPoint scrollViewOffset = scrollView.contentOffset; if (scrollViewOffset.x > MAX_VALUE) { scrollViewOffset.x = MAX_VALUE; } [scrollView setContentOffset:scrollViewOffset]; } 

第一种解决方案既有优点也有缺点,因为UIScrollView将管理弹跳(就像拉动刷新一样)。 它更自然且与HIG兼容,但如果您真的需要用户不要在某一行下面看到,请使用委托方法。

UITableView是UIScrollView的子类。 这意味着您可以使用UIScrollViewDelegate所有方法。 尝试在以下委托方法中添加scrollView.contentOffset逻辑:

 - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView;