强制UITableView滚动到单元格的顶部

Tyl*_*itt 10 iphone uitableview ios

有没有办法让UITableViews滚动单元格到单元格?也就是说,表视图的顶部始终是UITableViewCell的顶部.

我尝试了分页标志,但这似乎滚动整个"页面".我只想要细胞滚动细胞.

谢谢

Tör*_*yar 20

UTTableView是的子类UIScrollView,因此您可以使用scrollViewDidScroll方法在滚动后重新排列TableView滚动位置.

您可以使用tableView.contentOffset获取当前滚动位置的位置.通过将其划分为有意义的数字,您可以获得最顶层的单元格.

int cellIndex = tableView.contentOffset / cellHegiht;
Run Code Online (Sandbox Code Playgroud)

或者你可以在中心(顶部,底部)获得当前可见的单元格,如下所示:

NSArray *indexPathsForVisibleRows = [tableView indexPathsForVisibleRows];
NSIndexPath *selectedIndexPath = [indexPathsForVisibleRows objectAtIndex:(indexPathsForVisibleRows.count / 2)]; //this gets center cell
Run Code Online (Sandbox Code Playgroud)

在计算顶部(或底部)边缘点击哪个单元格后,您可以通过调用以下方法来校正单元格边缘的漂移:

[tableView scrollToRowAtIndexPath:selectedIndexPath atScrollPosition:UITableViewScrollPositionTop animated:YES];
Run Code Online (Sandbox Code Playgroud)

您可以使用UIScrollViewDelegate方法激活捕捉.您可以在滚动动画完成时或动画仍在继续时激活.这将产生不同的用户交互,并且不能说一个比另一个好.

但只是实现以下方法,没有别的东西看起来像我最喜欢的:

- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView
                     withVelocity:(CGPoint)velocity
              targetContentOffset:(inout CGPoint *)targetContentOffset {
    int cellHeight = 41;
    *targetContentOffset = CGPointMake(targetContentOffset->x,
                                       targetContentOffset->y - (((int)targetContentOffset->y) % cellHeight));
}
Run Code Online (Sandbox Code Playgroud)

当用户触摸TableView通知应用程序时,将调用此方法.targetContentOffset是一个inout变量,因此您可以在动画继续时实际设置最终滚动位置.使用右键cellHeight,您TableView将始终捕捉细胞.

  • 感谢您展示如何使用`inout`变量.非常好的功能! (2认同)