iPhone 14 Pro系列UITableView出现异常弹跳问题求助
解决iPhone 14 Pro/Pro Max上UITableView异常弹跳问题
原因分析
该问题核心与iPhone 14 Pro系列的动态岛安全区域动态调整有关:弹窗关闭时,系统会重新计算并调整页面安全区域参数,导致UITableView的contentInset或contentOffset被意外篡改,进而触发异常弹跳。
具体修复方案
方案1:弹窗关闭时锁定contentOffset
在弹窗关闭的回调逻辑中,提前记录当前列表偏移量,关闭后强制恢复,避免系统自动调整引发弹跳:// 弹窗关闭前记录当前偏移 let savedOffset = tableView.contentOffset // 执行弹窗关闭动画 dismiss(animated: true) { // 无动画恢复偏移量 self.tableView.setContentOffset(savedOffset, animated: false) }方案2:禁用自动滚动视图插入调整
在ViewController的viewDidLoad中关闭系统自动调整,手动适配安全区域:// 关闭自动调整 automaticallyAdjustsScrollViewInsets = false // 手动设置contentInset适配安全区域 let safeInsets = view.safeAreaInsets tableView.contentInset = UIEdgeInsets(top: safeInsets.top, left: 0, bottom: safeInsets.bottom, right: 0) tableView.scrollIndicatorInsets = tableView.contentInset方案3:修改弹窗的Presentation Style
若弹窗为自定义实现,改用overFullScreen的展示样式,减少安全区域的大幅变动:let popupVC = YourPopupViewController() popupVC.modalPresentationStyle = .overFullScreen popupVC.modalTransitionStyle = .crossDissolve present(popupVC, animated: true)方案4:监听安全区域变化修正偏移
添加安全区域变化监听,在回调中强制修正列表偏移:override func viewSafeAreaInsetsDidChange() { super.viewSafeAreaInsetsDidChange() // 仅针对iPhone 14 Pro系列机型处理 if UIDevice.current.model.hasSuffix("Pro") || UIDevice.current.model.hasSuffix("Pro Max") { let currentOffset = tableView.contentOffset tableView.setContentOffset(currentOffset, animated: false) } }
验证建议
修改代码后,在iPhone 14 Pro/Pro Max的模拟器及真机上测试弹窗关闭后的列表滚动状态,确认弹跳现象消除即可。
内容的提问来源于stack exchange,提问作者Phuah Yee Keat
相关产品推荐
相关产品推荐

