最近遇到一個(gè)問(wèn)題糯崎,當(dāng)UITableView或UICollectionView使用動(dòng)態(tài)行高毁兆,會(huì)出現(xiàn)初始行高不準(zhǔn)主到,如果想滑動(dòng)到指定位置茶行,會(huì)出現(xiàn)偏差
如果是想要滑動(dòng)到指定組,使用scrollToRow即可實(shí)現(xiàn)
本文主要討論滑動(dòng)到指定位置登钥,或者滑動(dòng)到指定組但是需要附加一定偏移量的場(chǎng)景
動(dòng)態(tài)行高布局
設(shè)置初始默認(rèn)行高
fileprivate let tableView: UITableView = UITableView(frame: CGRect.zero, style: .grouped).then {
$0.estimatedRowHeight = 100
$0.estimatedSectionHeaderHeight = 10
$0.estimatedSectionFooterHeight = 10
}
返回動(dòng)態(tài)行高
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return UITableView.automaticDimension
}
cell內(nèi)部使用Masonry或者SnpKit來(lái)進(jìn)行布局
分析
因?yàn)樾懈呤莿?dòng)態(tài)的畔师,當(dāng)下方的cell未滑動(dòng)出現(xiàn)時(shí),實(shí)際并未確定真實(shí)高度牧牢,此時(shí)設(shè)置滑動(dòng)位置會(huì)出現(xiàn)偏差
嘗試過(guò)設(shè)置contenOffset看锉、 scrollToRow、 scrollRectToVisible等方法塔鳍,均不能準(zhǔn)確滑動(dòng)到指定位置伯铣,因?yàn)榛瑒?dòng)過(guò)程中才真正確定cell行高
實(shí)踐中發(fā)現(xiàn)當(dāng)整個(gè)UITableView或UICollectionView從頭部滑動(dòng)到尾部,此時(shí)設(shè)置滑動(dòng)位置不會(huì)出現(xiàn)問(wèn)題轮纫,因?yàn)閏ell已經(jīng)加載出現(xiàn)腔寡,cell行高也已經(jīng)確定
即:當(dāng)使用動(dòng)態(tài)行高布局,cell未加載出現(xiàn)時(shí)掌唾,行高未知放前,滑動(dòng)會(huì)因此出現(xiàn)偏差
解決方案
通過(guò)兩步結(jié)合來(lái)解決此問(wèn)題
- 通過(guò)scrollToRow滑動(dòng)到大概位置
- 在滑動(dòng)過(guò)程中附加動(dòng)畫(huà)進(jìn)行二次滑動(dòng)偏移 scrollRectToVisible
func scrollToSection(tableView: UITableView, section: Int) {
tableView.scrollToRow(at: IndexPath(item: 0, section: section), at: .top, animated: true)
DispatchQueue.main.asyncAfter(deadline: .now()+0.2) {
var rect: CGRect = tableView.rect(forSection: section)
var rectOrigin = rect.origin
rectOrigin.y -= TWSwiftStatusAndNavigationHeigth + RentHouseDetailViewController.Metric.segMentViewHeight
rect.origin = rectOrigin
let insets = tableView.contentInset
rect.size = tableView.frame.size
rect.size.height -= insets.top + insets.bottom
let offsetY = (rect.origin.y + rect.size.height) - tableView.contentSize.height
if offsetY > 0.0 {
rect = rect.offsetBy(dx: 0, dy: -offsetY)
}
tableView.scrollRectToVisible(rect, animated: false)
}
}
動(dòng)畫(huà)效果較為連貫,不會(huì)出現(xiàn)肉眼可見(jiàn)二次偏移
這樣的寫(xiě)法主要是可以解決cell未加載出現(xiàn)時(shí)糯彬,行高未知的問(wèn)題凭语;
在滑動(dòng)到大概位置的時(shí)候,cell已經(jīng)出現(xiàn)撩扒,行高確定似扔,此時(shí)再進(jìn)行偏移,可以準(zhǔn)確滑動(dòng),不會(huì)出現(xiàn)偏差