iOS tableView 滚动到指定行/段 以及遇到的bug 指南
滚动方式
本篇中的bug会不定期更新的,有更好解决办法或者 有 新的Bug探讨的请加QQ:1290281526 私聊
选中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了】