SwiftUI中List与键盘、安全区域相关的视觉Bug问题
SwiftUI List 搭配 TextField 时的聚焦取消视觉卡顿问题
问题现象
在 iOS 16.0 和 16.1 版本中,使用 SwiftUI 的 List 嵌套 TextField 时会出现视觉 Bug:
- 聚焦任意 TextField 后取消焦点(通过列表行内按钮、键盘工具栏等方式),键盘后方的黑色视图会先消失,但安全区域上方的对应部分会卡顿约一秒后突然消失,导致动画不流畅。
- 若滚动到 List 底部执行相同操作,黑色视图卡顿消失后还会引发 List 轻微“跳变”,彻底破坏动画连贯性。
最小复现代码
struct ContentView: View { @State var text: String = "" @FocusState private var focused: Int? var body: some View { List { ForEach(0..<50) { item in HStack { TextField("", text: $text) .id(item) .focused($focused, equals: item) .background(.white) Button { focused = nil } label: { Text("Hide") } } } } .scrollContentBackground(.hidden) .background(.red) } }
已尝试的无效方案
- 将 List 放入 VStack 并在下方添加额外视图:不符合原有 UI 设计需求
- 替换为 ScrollView:键盘消失后,键盘避让产生的底部额外留白需要手动滚动才会消失,引入新问题
- 忽略 List/ScrollView 的安全区域:虽能解决卡顿,但会直接禁用键盘避让功能,无法满足需求
修复说明
该视觉 Bug 在 iOS 16.5 及对应的 Xcode 版本中已被官方修复。
内容的提问来源于stack exchange,提问作者MattGreeny
相关产品推荐
相关产品推荐

