想象一下一个普通的UITableView,其中包含200行的列表。
其中一些行是自定义的,伪装成UI Section
标题行,并支持到达顶部时为粘性。
非常类似于股票iOS Contacts 应用。
当用户滚动表视图时,它会跟踪那些自定义节行在滚动视图中的位置,并管理何时应粘贴,何时应释放它们以滚动出顶部以供其他节行替换。
func scrollViewDidScroll(_ scrollView: UIScrollView) {
...
for sectionRow in allSectionRows {
let sectionRowRect = tableView.rectForRow(at: sectionRow.indexPath)
let rowPositionY = sectionRowRect.origin.y + -tableView.contentOffset.y
// ... compare rowPositionY if it has reached or passed
// its sticky location in tableview
}
...
}
虽然这种方法可以很好地跟踪每一行的位置,但是我发现将其与约50个节的行进行缩放会对性能产生影响。导致较慢的iOS设备以〜10-15fps的速度滚动,从而破坏了流畅的用户体验。
在我的测试中表明,tableView.rectForRow()
和tableView.contentOffset.y
是处理时间的罪魁祸首。立即删除其中任何一个均可改善滚动效果。当然,这样会破坏功能。
我尝试缓存sectionRowRect = tableView.rectForRow(at: sectionRow.indexPath)
,但是却发现了一个奇怪的伪像,其中rowPositionY
似乎在漂移。
可以考虑采用哪种可能的优化来解决此循环?