Xcode 13.1编译项目iOS 15.0模拟器UITableView偶发cell消失问题
问题原因
这是Xcode 13.x版本构建项目运行在iOS 15系统时的已知UITableView渲染异常,多发生在多section、使用自动布局动态计算cell/区头区尾高度的场景,本质是系统层布局计算和渲染调度异常,导致部分cell未被正常绘制到视图层级,滚动时的复用逻辑会随机触发重新绘制所以会出现时有时无的情况。
可行解决方案
- 方案1:关闭UITableView预估高度
在App启动入口application:didFinishLaunchingWithOptions:中添加全局配置,全局生效:
// Objective-C 实现 if (@available(iOS 15.0, *)) { [UITableView appearance].estimatedRowHeight = 0; [UITableView appearance].estimatedSectionHeaderHeight = 0; [UITableView appearance].estimatedSectionFooterHeight = 0; }
// Swift 实现 if #available(iOS 15.0, *) { UITableView.appearance().estimatedRowHeight = 0 UITableView.appearance().estimatedSectionHeaderHeight = 0 UITableView.appearance().estimatedSectionFooterHeight = 0 }
如果仅部分列表出现问题,也可以单独给对应UITableView实例设置上述三个属性为0即可。
- 方案2:强制cell触发重绘
若不想关闭预估高度特性,可以在自定义UITableViewCell的布局回调中强制触发重绘,代码如下:
// Objective-C 自定义Cell实现 - (void)layoutSubviews { [super layoutSubviews]; [self setNeedsDisplay]; }
// Swift 自定义Cell实现 override func layoutSubviews() { super.layoutSubviews() setNeedsDisplay() }
- 方案3:修复模拟器兼容配置
如果问题仅在iOS 15模拟器上出现,打开模拟器顶部菜单栏Features > Reset Content and Settings重置模拟器,再进入模拟器的设置 > 开发者关闭Metal API Validation选项,重启模拟器后重新运行项目即可,该情况为Xcode 13版本模拟器Metal渲染引擎的适配bug。 - 方案4:升级Xcode版本
该bug已经在Xcode 13.3及后续版本被苹果官方修复,升级Xcode到13.3以上版本重新编译项目即可彻底解决该问题。
内容的提问来源于stack exchange,提问作者Chandan Kumar Jha
相关产品推荐
相关产品推荐

