SwiftUI scaleEffect会导致不必要的位置更改

SwiftUI scaleEffect会导致不必要的位置更改,swiftui,swiftui-animation,Swiftui,Swiftui Animation,Xcode 12.4+macOS 11.2.3 我在Mac应用程序中整合了一个非常简单的SwiftUI项目,我不明白为什么scaleEffect会这样 这是我的密码: import SwiftUI struct ContentView: View { @State var active = false var body: some View { VStack{ Text("Hi") .scaleEffect(active ?

Xcode 12.4+macOS 11.2.3

我在Mac应用程序中整合了一个非常简单的SwiftUI项目,我不明白为什么
scaleEffect
会这样

这是我的密码:

import SwiftUI

struct ContentView: View {
  @State var active = false
  
  var body: some View {
    VStack{
      Text("Hi")
        .scaleEffect(active ? 2 : 1)
        .animation(Animation.easeInOut(duration: 1).repeatForever())
      Button("Toggle Animation"){
        active.toggle()
      }
    }
    .frame(width:200, height:200)
  }
}
我的期望是,只要我点击按钮,“Hi”文本就会增长两倍大。相反,一旦我的视图加载,文本就会上下移动。单击按钮后,文本开始变大变小,但上下移动仍在继续

为什么
文本不能保持原样,只是变得越来越大越来越小?

动画在iOS或macOS中的工作方式是:它看到并观察参数的差异,并尝试回答它们,除非我们说忽略某些更改!或者像我在代码中做的那样观察特殊的变化



“Hi”移动到位后,仍然有一个不需要的初始动画,但我找到了一种可靠地启动和停止动画的方法:

Text("Hi")
  .scaleEffect(active ? 2 : 1)
  .animation(active ? Animation.easeInOut(duration: 1).repeatForever() : Animation.default)
我发现这个答案很有帮助:


使用
.repeatFoever()
动画,当条件不再为
true
时,必须向其传递动画,以覆盖之前的永久重复动画。

感谢您的快速回复。这似乎没有改变什么。“嗨”的文字还在上下摆动。@CliftonLabrum:很抱歉,我一开始就误解了你的问题!请检查新答案。非常好,谢谢。然而,似乎还有最后一个bug。当我单击切换按钮并将
active
设置为
false
时,动画将继续。你看到了同样的问题吗?@CliftonLabrum:这不是问题!因为你确实把.repeatForever()的代码放在了动画中。如果要停止动画重复,则可以使用以下代码:.animation(animation.easeInOut(duration:1),value:active)正确,但不应将
active
设置为
false
使动画停止?此问题是否仍然存在问题?还是我的回答解决了问题?你帮了大忙,谢谢。不过,你的解决方案并没有完全解决这个问题。我发布了另一个解决问题的答案。再次感谢!欢迎你,很高兴你找到了答案。但基本上我的答案是你们发布的答案。
Text("Hi")
  .scaleEffect(active ? 2 : 1)
  .animation(active ? Animation.easeInOut(duration: 1).repeatForever() : Animation.default)