NavigationStack结合List与NavigationLink的跳转动画异常问题咨询
问题场景复现
以下代码会触发异常:
NavigationStack { List { ForEach(0..<15) { _ in NavigationLink(destination: SomeView()) { RowItem() } } } }
- 导航栏使用大标题时,点击列表项跳转正常
- 向下滚动让大标题缩小后点击列表项,转场过程中所有列表元素会向下跳动(因系统错误预留大标题空间)
- 返回原页面后恢复正常,旧版NavigationView无此问题
而将NavigationLink嵌套进VStack后,动画表现正常:
VStack { NavigationLink(destination: SomeView()) { RowItem() } }
问题原因
这个跳动是SwiftUI NavigationStack的布局计算bug:当导航栏处于缩小状态触发转场时,系统错误地认为需要恢复大标题的高度,临时调整了List的布局偏移,导致元素跳动。而嵌套VStack/HStack后,容器将NavigationLink与List的直接布局关联隔离开,避免了错误的布局重计算。
嵌套栈容器的实践合理性
把NavigationLink嵌入VStack/HStack不属于不良实践,反而在这个场景下是有效的规避方案。SwiftUI中,容器视图本就用于管理组件间的布局依赖,只要没有添加不必要的布局属性(如多余的padding、spacing),就不会带来性能或体验损耗。
内容的提问来源于stack exchange,提问作者vlad_skazka
相关产品推荐
相关产品推荐

