ios - 如何使用 SwiftUI 为明暗模式之间的转换设置动画?

标签 ios swift swiftui

我不知道 SwiftUI 是否支持这一点,但是当按钮为我在屏幕底部有一个导航栏,其中有一个按钮,点击时会从太阳图标切换到月亮图标。

从浅色模式切换到深色模式,反之亦然,但效果立竿见影,看起来就像有人刚刚关掉了灯。以下代码中使用的动画仅更改带有动画的按钮的图像。

这是我的:

NavigationBarView.swift

struct NavigationBarView: View {

@AppStorage("isDarkMode") private var isDarkMode = false
...

var body: some View {
    ZStack {
        ...
            Button(action: {
                withAnimation(.easeInOut) {
                    isDarkMode.toggle()
                }
            }, label: {
                if isDarkMode {
                    Image.sunButton
                        .resizable()
                        .imageScale(.large)
                        .frame(width: 24, height: 24)
                        .foregroundColor(Color.darkGray)
                } else {
                    Image.moonButton
                        .resizable()
                        .imageScale(.large)
                        .frame(width: 24, height: 24)
                        .foregroundColor(Color.darkGray)
                }
                
            })
            
        ...
        
        }
    }
    ...
}

LucidityApp.swift

@main
struct LucidityApp: App {

@Environment(\.colorScheme) var colorScheme
@AppStorage("isDarkMode") private var isDarkMode = false

var body: some Scene {
    WindowGroup {
        Dashboard()
            .preferredColorScheme(isDarkMode ? .dark : .light)
            .background(colorScheme == .dark ? Color.darkGray : Color.white)
    }
}

预先感谢您的帮助,我是 SwiftUI 的新手,所以如果您有任何最佳实践提示,我很乐意倾听!

谢恩

编辑:我找到了解决方案,我将 WindowGroup 包装在 VStack 中的主应用程序 SwiftUI 文件中,并使用 .animation(.spring(), value: isDarkMode 将 .animation 应用于 VStack ) 并按照我想要的方式从浅色模式过渡到深色模式。

最佳答案

要使动画正常工作,您需要添加过渡,过渡控制 View 的插入和移除方式。

    Button(action: {
        withAnimation(.easeInOut) {
            isDarkMode.toggle()
        }
    }, label: {
        if isDarkMode {
            Image.sunButton
                .resizable()
                .imageScale(.large)
                .frame(width: 24, height: 24)
                .foregroundColor(Color.darkGray)
                .transition(.asymmetric(insertion: .opacity, removal: .opacity))
        }
        else {
            Image.moonButton
                .resizable()
                .imageScale(.large)
                .frame(width: 24, height: 24)
                .foregroundColor(Color.darkGray)
                .transition(.asymmetric(insertion: .opacity, removal: .opacity))
        }
        
    })

转换的行为方式也可以根据您的需要进行更改,请参阅 apple documentation

关于ios - 如何使用 SwiftUI 为明暗模式之间的转换设置动画?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72252516/

相关文章:

ios - 通过 CNContactViewController 显示时,联系人缺少一些必需的键描述符

swift - 协议(protocol)实现 init 的访问控制

ios - SwiftUI 中的动态转换

ios - 如何在 Swift 中设置按钮图像

ios - Swift NSKeyedArchiver 到文件 : Unresolved Identifier

scrollview - SwiftUI 图像在 NavigationLink 中消失

ios - 在 iOS 上将 SwiftUI View 转换为 PDF

ios - 裁剪 UIImage 没有产生预期的裁剪 - swift ?

ios - 重用 Table View 变量 Swift

ios - Firebase iOS Facebook 简单登录错误