iOS 26 RC:缩放导航过渡滑动返回后视图消失问题
iOS 16 RC中SwiftUI缩放导航过渡滑动返回后Push按钮消失的解决方案
这个问题是iOS 16 RC版本中SwiftUI导航过渡的已知bug,当matchedTransitionSource与navigationTransition(.zoom)结合使用,且源视图位于ScrollView内部时,滑动返回的交互会导致源视图(Push按钮)的动画状态异常,从而被隐藏。
以下是几个可行的解决办法:
方法1:将源按钮移出ScrollView
把Push按钮从ScrollView中移出,避免滚动容器与过渡动画的状态冲突:
import SwiftUI struct ContentView: View { @State private var paths = [String]() @Namespace var ns var body: some View { NavigationStack(path: $paths) { VStack { Button("Push") { paths.append("a") } .matchedTransitionSource(id: "a", in: ns) ScrollView { // 原ScrollView内的其他内容 } } .navigationDestination(for: String.self, destination: { id in Text(id) .navigationTransition(.zoom(sourceID: "a", in: ns)) }) } } } #Preview { ContentView() }
方法2:强制刷新源视图状态
通过监听路径的变化,手动触发源视图的刷新,确保滑动返回后按钮恢复可见:
import SwiftUI struct ContentView: View { @State private var paths = [String]() @Namespace var ns @State private var refreshTrigger = UUID() // 用于强制刷新 var body: some View { NavigationStack(path: $paths) { ScrollView { Button("Push") { paths.append("a") } .matchedTransitionSource(id: "a", in: ns) .id(refreshTrigger) // 绑定ID实现视图刷新 } .navigationDestination(for: String.self, destination: { id in Text(id) .navigationTransition(.zoom(sourceID: "a", in: ns)) }) .onChange(of: paths) { newValue in // 当路径清空(返回主页面)时,触发刷新 if newValue.isEmpty { refreshTrigger = UUID() } } } } } #Preview { ContentView() }
方法3:升级到iOS 16正式版
iOS 16 RC版本存在不少过渡动画相关的bug,苹果在正式版中修复了大量此类问题,升级到正式版后该问题大概率会自动解决。
内容的提问来源于stack exchange,提问作者Kai Shao
相关产品推荐
相关产品推荐

