SwiftUI中NavigationLink从List跳转新视图出现异常转场动画如何修复

问题原因
这个转场动画异常是三处代码书写不规范导致的:
- List专属修饰符错挂到父容器VStack上,导致List单元格布局在转场时重新计算,出现错位动画
- 目标视图的背景色挂载层级错误,导航转场时背景会跟随内容一起偏移,出现背景割裂的视觉效果
- 未指定NavigationView的样式,iOS默认的自适应样式在部分设备上会触发非预期的转场动画
修复步骤
1. 修正InsightsHomeView的修饰符位置
把原来挂在VStack上的.listStyle和.listRowBackground移到List本身,同时给NavigationView指定栈式样式:
struct InsightsHomeView: View { var body: some View { NavigationView { VStack { if historicalDataManager.arrayOfCareerMaxSpeedValuesAsCustomHistoricalSample.count > 0 { List { Section(header: Text("Speed & Distance")) { // 原有NavigationLink内容保持不变 NavigationLink(destination: ...) { InsightsLabel(...) } .buttonStyle(.plain) // 可选,消除cell默认点击样式干扰 } } //end of list // 👇把这两个修饰符移到List上 .listStyle(InsetGroupedListStyle()) .listRowBackground(colorScheme == .dark ? Color(.secondarySystemBackground) : Color(.systemBackground)) } else { // 原有加载视图保持不变 } } .navigationTitle("Browse") } // 👇指定NavigationView为栈式样式,避免双栏样式带来的转场异常 .navigationViewStyle(.stack) .background(Color(colorScheme == .dark ? .black : .secondarySystemBackground)) } }
2. 修正InsightsCard的背景挂载层级
把原来加在内部VStack上的背景色移到ScrollView上,同时忽略安全区域适配:
struct InsightsCard: View { var body: some View { ScrollView { VStack(alignment: .leading) { // 原有所有内容保持不变 } //end of Master VStack .if(!subscriptionIsActive) { $0.redacted(reason: .placeholder) } .navigationBarItems(trailing: /* 原有Filter按钮保持不变 */ ) // 👇删除此处原来的background修饰符 } //endOfScrollView // 👇背景色改到ScrollView上挂载,同时忽略安全区域 .background(Color(colorScheme == .dark ? .black : .secondarySystemBackground).ignoresSafeArea()) } }
修改完成后即可解决导航转场动画异常的问题。
内容的提问来源于stack exchange,提问作者GarySabo
相关产品推荐
相关产品推荐

