【问题标题】:why does not withAnimation working without .animation为什么 withAnimation 不使用 .animation
【发布时间】:2021-08-10 06:39:11
【问题描述】:

我有一个像这样的 Shake 动画扩展, 导入 SwiftUI

struct WRShake: GeometryEffect {
    var amount: CGFloat = 10
    var shakesPerUnit = 3
    var animatableData: CGFloat

    func effectValue(size: CGSize) -> ProjectionTransform {
        ProjectionTransform(CGAffineTransform(translationX: amount * sin(animatableData * .pi * CGFloat(shakesPerUnit)), y: 0))
    }
}

extension View {
    
    func wrshake(amount: CGFloat = 10, shakeUnits: Int = 4, animatableData: CGFloat) -> some View {
        return modifier(WRShake(amount: amount, shakesPerUnit: shakeUnits, animatableData: animatableData))
    }
}

然后在 contentView 中,我得到了这个

var body: some Scene {
        WindowGroup {
            NavigationView {
                VStack {
                    Text("111")
                        .padding()
                        .background(Color.blue)
                        .wrshake(animatableData: self.shakeValue)
//                        .animation(.easeInOut(duration: 0.5))
                        .layoutPriority(1)

                    Button {
                        withAnimation(.easeInOut(duration: 1)) {
                            self.shakeValue += 1
                        }
//                        self.shakeValue += 1
                    } label: {
                        Text("shake")
                    }
                }
            }
        }

然后奇怪的是,如果我不将 .animation(.easeInOut(duration: 0.5)) 应用于文本视图,则没有动画。

有人知道为什么吗?

谢谢

【问题讨论】:

  • 我的 xcode 版本是:版本 12.5.1 (12E507)

标签: swiftui


【解决方案1】:

我认为是因为您在 :App 类上使用了显式动画,而该类不处理显式动画。 显式动画是当您使用 withAnimation 块并离开系统来确定动画的方式时。

我想在@main 类中你确实放了@State var shakeValue: CGFloat = 0 但因为它是一个:App 而不是View 它不会改变。

它可以添加.animation(.easeInOut(duration: 0.5)),因为它返回一个处理动画的新视图,就像您提取ContentView() 之类的视图时一样。

(隐式动画是当你应用修饰符.animation(...)时)

【讨论】:

    【解决方案2】:
        WindowGroup {
                NavigationView {
    //                StartUpView()
                    ContentView()
                }
    //            .navigationViewStyle(StackNavigationViewStyle())
    
        }
    

    事实证明,如果我将所有内容都包装到 ContentView 中,它可以工作,但为什么呢?

    【讨论】:

      猜你喜欢
      • 2011-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多