SwiftUI 中的动画日期变化

Posted

技术标签:

【中文标题】SwiftUI 中的动画日期变化【英文标题】:Animating date changes in SwiftUI 【发布时间】:2020-10-29 12:42:43 【问题描述】:

我正在努力创建一个更改日期值的动画。下面是一个简化的例子。当日期从其原始值更新为新值时,它旨在通过更改值来更新文本视图。非常感谢您的帮助!

struct DateAnimationView: View 

    @State var date = Date()

    typealias AnimatableData = Date

    var animatableData: Date
        getdate
        setdate = newValue
    

    var body: some View 
        VStack
            Text(date, style: .time)
                .padding()
            
            Button(action:
                withAnimation(.linear(duration: 3.0))
                    date.addTimeInterval(60 * 60 * 3)
                
            )
                Text("Add 3 hours")
            
                .padding()
            Spacer()
        
    

又一次失败的尝试:

struct InnerView: View 
    var date: Date
    var interval: TimeInterval
        
    typealias AnimatableData = TimeInterval
    
    var animatableData: TimeInterval
        getinterval
        setinterval = newValue
    
    
    var body: some View
        Text(date.addingTimeInterval(interval), style: .time)
    


struct DateAnimationView: View
    @State var isOn: Bool = false
    var body: some View
        VStack
            InnerView(date: Date(), interval: isOn ? 60*60*3 : 0)
            Button(action:
                isOn.toggle()
            )
                Text("Go")
            
        
    

【问题讨论】:

【参考方案1】:

基本思想是您需要为要制作动画的组件指定一个 id。 SwiftUI 在重绘时使用这个 id 来了解它是同一个组件还是新组件。如果它是一个新组件,它将删除旧组件并添加一个带有动画的新组件。下面的代码实现了动画。

struct DateAnimationView: View 
    @State var date = Date()

    typealias AnimatableData = Date

    var animatableData: Date
        getdate
        setdate = newValue
    

    var body: some View 
        VStack
            Text(date, style: .time)
                .padding()
                .id(String(date.hashValue))
            
            Button(action:
                withAnimation(.linear(duration: 3.0))
                    date.addTimeInterval(60 * 60 * 3)
                
            )
                Text("Add 3 hours")
            
                .padding()
            Spacer()
        
    

解决方案posted here解决了类似的问题。

【讨论】:

感谢您的快速响应。不幸的是,添加 id 似乎没有按预期工作。现在这两个日期值被简单地叠加了。需要明确的是,我希望在接近新时间时看到文本“计数”时间值。 (即:8:13 -> 8:42 -> 9:15 -> 10:22 -> 11:13)

以上是关于SwiftUI 中的动画日期变化的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SwiftUI 中自定义角度变化的动画

SwiftUI ButtonStyle scaleEffect 动画按钮位置变化

SwiftUI找回丢失的列表视图(List)动画

SwiftUI找回丢失的列表视图(List)动画

在Mac应用中使用SwiftUI更改动画窗口大小

SwiftUI - 脉动动画和改变颜色