SwiftUI导航栏可见性动画异常:内容跳转而非平滑过渡
导航栏可见性动画与内容平滑过渡问题
想要实现导航栏可见性切换的动画效果,同时让屏幕内容随导航栏平滑上下移动,但尝试多种方法都存在问题:
- 使用
animation(_:value:)修饰符时,导航栏能实现平滑动画,但屏幕内容会直接跳转,没有平滑过渡效果 - 使用无
value参数的animation(_:)修饰符可以解决内容跳转问题,但该方法已被弃用,还存在其他副作用 - 将按钮操作包裹在
withAnimation代码块中也无法解决问题
示例代码如下:
struct ContentView: View { @State private var showNavBar = true var body: some View { NavigationStack { Button("Toggle nav bar") { showNavBar.toggle() } .navigationTitle("Test") .toolbar(showNavBar ? .visible : .hidden) .animation(.default, value: showNavBar) } } }
当前效果:按钮位置无平滑动画
变通方案
未找到完美解决方案,最终采用以下可行的变通方法:
import SwiftUI public extension View { func navigationBar(visible: Bool) -> some View { modifier(NavigationBarVisibleViewModifier(visible: visible)) } } private struct NavigationBarVisibleViewModifier: ViewModifier { let visible: Bool @State private var isAnimatingNavigationBar = false @State private var visibility: Visibility = .visible init(visible: Bool) { self.visible = visible self.visibility = visible ? .visible : .hidden } func body( content: Content ) -> some View { content .toolbar(visibility) .onChange(of: visible) { newValue in isAnimatingNavigationBar = true visibility = newValue ? .visible : .hidden } .transaction { transaction in if isAnimatingNavigationBar { transaction.animation = .easeOut(duration: 0.2) transaction.disablesAnimations = true DispatchQueue.main.async { isAnimatingNavigationBar = false } } } } }
内容的提问来源于stack exchange,提问作者Rengers
相关产品推荐
相关产品推荐

