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 个方法结合使用
- 使用 scrollToRow,滚动目的位置的附近.这里需要
加上动画,加入动画以后,滚动时,系统才能将目的位置前的 cell 全部加载,展示,并且计算高度;否则,后面的scrollRectToVisible使用后,还是会有误差
- 在进行精确计算后,使用 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;