UITableView 滚动到指定位置(scrollToRow与scrollRectToVisible)

scrollToRow与scrollRectToVisible

  • scrollToRow是通过设置 indexPath,滚动到指定的行
  • scrollRectToVisible:scroll so rect is just visible (nearest edges). nothing if rect completely visible; 某个cell 如果完全显示,或者不接近边界.该方法不生效.

滚动时,是否开启动画

open func scrollRectToVisible(_ rect: CGRect, animated: Bool)
open func scrollToRow(at indexPath: IndexPath, at scrollPosition: UITableView.ScrollPosition, animated: Bool)

这两个方法,都是可以设置动画属性的
动画属性的设置

滚动到指定位置

一般的UITableView

如果contentSize 较小,或者滚动的目的点比较简单,使用 scrollToRow 到指定的 cell

滚动到目的点的场景比较复杂需要 2 个方法结合使用
  1. 使用 scrollToRow,滚动目的位置的附近.这里需要加上动画,加入动画以后,滚动时,系统才能将目的位置前的 cell 全部加载,展示,并且计算高度;否则,后面的scrollRectToVisible使用后,还是会有误差
  2. 在进行精确计算后,使用 scrollRectToVisible 方法,滚动到指定位置.scrollToRow 使用动画以后,会有 0.25s 的延时.因此,必须等 0.25s 之后,再用scrollRectToVisible偷偷进行一次矫正滑动
    比如:
tableView.scrollToRow(at: IndexPath.init(row: 0, section: 4), at: .top, animated: true)

let height = (kScreenWidth + introType.rawValue + comssionCellHeight + sellCellHeight + couponCellHeight) - (heightOfAddtionalHeader + 64)
// 
DispatchQueue.main.asyncAfter(deadline: .now()+0.3) {
  self.tableView.scrollRectToVisible(CGRect.init(x: 0, y: height, width: kScreenWidth, height: kScreenHeight), animated: false)
}

后续

针对tableView 没有自动设置行高的,简单实用的办法:

tableView.estimatedRowHeight = 0;
tableView.estimatedSectionFooterHeight = 0;
tableView.estimatedSectionHeaderHeight = 0;

你可能感兴趣的:(UITableView 滚动到指定位置(scrollToRow与scrollRectToVisible))