iOS中在Block内重载TableView Cell导致滚动跳动问题
解决iOS 11 UITableView刷新Cell动画导致滚动跳动的问题
我之前也碰到过iOS 11里这个烦人的小问题!在Alert Action的Block里用UITableViewRowAnimationFade刷新Cell时,总会出现约10像素的滚动偏移,不是滚到Section顶部,就是莫名跳一下,特别影响体验。下面是我试过的几个有效解决方案,你可以按需尝试:
方案一:强制保留原滚动偏移量
这个方法最直接有效——先记录刷新前的contentOffset,等刷新和布局完成后再强制恢复回去,避免动画过程中TableView自动调整偏移:
// 在你的Alert Action回调里 let originalOffset = tableView.contentOffset // 执行Cell刷新 tableView.reloadRows(at: [yourTargetIndexPath], with: .fade) // 强制完成当前布局,确保偏移计算准确 tableView.layoutIfNeeded() // 恢复原偏移,关闭动画避免二次跳动 tableView.setContentOffset(originalOffset, animated: false)
方案二:用beginUpdates/endUpdates包裹刷新操作
iOS 11里TableView的动画处理逻辑有一些小改动,用beginUpdates()和endUpdates()包裹刷新,能让TableView更稳妥地处理动画过程中的布局计算,减少偏移异常:
tableView.beginUpdates() tableView.reloadRows(at: [yourTargetIndexPath], with: .fade) tableView.endUpdates()
方案三:错开Alert消失与TableView刷新的时机
有时候问题是Alert的消失动画和TableView的刷新动画冲突导致的,把刷新操作延迟到Alert完全消失后执行,也能解决这个问题:
// 在Alert Action里 DispatchQueue.main.asyncAfter(deadline: .now() + 0.15) { self.tableView.reloadRows(at: [yourTargetIndexPath], with: .fade) }
这个时间不用太长,0.1-0.2秒足够Alert完成消失动画,不会让用户感觉到明显延迟。
额外注意点
如果你的TableView在NavigationController里,且NavigationBar是半透明的,可能还要考虑safeAreaInsets的影响——如果恢复偏移时发现还是有偏差,可以尝试调整偏移量:
let adjustedOffset = CGPoint(x: originalOffset.x, y: originalOffset.y - tableView.safeAreaInsets.top) tableView.setContentOffset(adjustedOffset, animated: false)
你可以先试试方案一,我当时就是靠这个解决的,亲测在iOS 11上有效!
内容的提问来源于stack exchange,提问作者Berry Blue
相关产品推荐
相关产品推荐

