iOS tableView 滾動到指定行/段 以及遇到的bug 指南
滾動方式
本篇中的bug會不定期更新的,有更好解決辦法或者 有 新的Bug探討的請加QQ:1290281526 私聊
選中cell滾動到指定位置
很簡單,一句話完事兒:
/*
最近選中的cell 滾動到 指定位置 :
UITableViewScrollPositionNone,
UITableViewScrollPositionTop, // 頂部
UITableViewScrollPositionMiddle, // 中間
UITableViewScrollPositionBottom// 底部
*/
[self.tableView scrollToNearestSelectedRowAtScrollPosition:UITableViewScrollPositionTop animated:YES];
/** 滾動到頂部 */
[self.tableView setScrollsToTop:YES];
/** 讓指定區(qū)域滾動到可視區(qū)域,如果已經(jīng)在可視區(qū)域 則該方法無效 */
[self.tableView scrollRectToVisible:CGRectMake(0, 0, 100, 100) animated:YES];
滾動到指定的 IndexPath
同樣的只是比上一個方法多了一個參數(shù):indexPath,只要是用過tableView的對這個應該都很熟悉吧。
/* 滾動指定段的指定row 到 指定位置*/
[self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:YES];
通過設置ScrollView的contentOffset滾動到指定的位置
這個方法比較靈活,但是問題也是最多的,筆者項目中是多層的tableView嵌套的多級目錄展開問題,就用到了這個同時也出現(xiàn)了一些問題。
/*通過設置contentOffset的方式滾動tableView到指定的位置*/
[self.tableView setContentOffset:CGPointMake(0, 0) animated:YES];
這里面需要一個很重要的參數(shù):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 的時候會出現(xiàn)滑動很大一部分空白區(qū)域。
estimatedSectionHeaderHeight動態(tài)計算屬性初始值不要設置太高,高出實際高度這里計算會出問題。一定要記住 NSIndexPath 對象里面的row 和 section 一定要和數(shù)據(jù)源對應。千萬不要越界!不要越界!不要越界!重要的事情說三遍。
-
滾動時 如果一旦滾動的幅度比較大,可能出現(xiàn)幾種情況:
1、速度太快,用戶會眼花 【超出某個閾值取消滾動動畫】
2、向下滾動,一旦offset出現(xiàn)負值,容易觸發(fā)下拉刷新 【根據(jù)業(yè)務需要過濾下拉刷新】
3、有過度下滑 出現(xiàn)空白區(qū)域,并且沒能觸發(fā)下拉刷新 不碰觸,不能收回?!救サ魟赢嬀蚈K了】