iOS tableView 滚动到指定行/段 以及遇到的bug 指南

iOS tableView 滚动到指定行/段 以及遇到的bug 指南

滚动方式

 

选中cell滚动到指定位置

很简单,一句话完事儿:

/* 
    最近选中的cell 滚动到  指定位置 :
    UITableViewScrollPositionNone, 
    UITableViewScrollPositionTop, // 顶部
    UITableViewScrollPositionMiddle, // 中间
    UITableViewScrollPositionBottom// 底部
*/
[self.tableView scrollToNearestSelectedRowAtScrollPosition:UITableViewScrollPositionTop animated:YES];

/** 滚动到顶部 */
[self.tableView setScrollsToTop:YES];
    
/** 让指定区域滚动到可视区域,如果已经在可视区域 则该方法无效 */
[self.tableView scrollRectToVisible:CGRectMake(0, 0, 100, 100) animated:YES];

滚动到指定的 IndexPath

同样的只是比上一个方法多了一个参数:indexPath,只要是用过tableView的对这个应该都很熟悉吧。

/* 滚动指定段的指定row  到 指定位置*/
[self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:YES];

通过设置ScrollView的contentOffset滚动到指定的位置

这个方法比较灵活,但是问题也是最多的,笔者项目中是多层的tableView嵌套的多级目录展开问题,就用到了这个同时也出现了一些问题。

/*通过设置contentOffset的方式滚动tableView到指定的位置*/
[self.tableView setContentOffset:CGPointMake(0, 0) animated:YES];

这里面需要一个很重要的参数:CGPoint
那么,这个位置我们改怎么计算得来?别急,Apple的UITableView组件自带了一些我们并不熟悉,但是却很强大的API。

/** 指定section的最顶部的rect */
[self.tableView rectForSection:0];
    
/** 指定cell的rect */
[self.tableView rectForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];
    
/** sectionHeader 的rect */
[self.tableView rectForHeaderInSection:0];
    
/** sectionFooter 的rect */
[self.tableView rectForFooterInSection:0];

另外在计算位置的时候可能会用到的UIView的方法:

/* viewB上的viewC相对于viewA的frame */
[viewB convertRect:viewC.frame toView:viewA];

/* viewA上的viewB相对于viewC的frame */
[viewC convertRect:viewB.frame fromView:viewA];

滚动时遇到的bug 以及解决

  • ScrollTop 的时候会出现滑动很大一部分空白区域。estimatedSectionHeaderHeight动态计算属性初始值不要设置太高,高出实际高度这里计算会出问题。
  • 一定要记住 NSIndexPath 对象里面的row 和 section 一定要和数据源对应。千万不要越界!不要越界!不要越界!重要的事情说三遍。
  • 滚动时 如果一旦滚动的幅度比较大,可能出现几种情况:
    • 1、速度太快,用户会眼花 【超出某个阈值取消滚动动画】
    • 2、向下滚动,一旦offset出现负值,容易触发下拉刷新 【根据业务需要过滤下拉刷新】
    • 3、有过度下滑 出现空白区域,并且没能触发下拉刷新 不碰触,不能收回。【去掉动画就OK了】

 

特别声明:文章多为网络转载,资源使用一般不提供任何帮助,特殊资源除外,如有侵权请联系!
技术狗 » iOS tableView 滚动到指定行/段 以及遇到的bug 指南