SwiftUI scaleEffect会导致不必要的位置更改
Xcode 12.4+macOS 11.2.3 我在Mac应用程序中整合了一个非常简单的SwiftUI项目,我不明白为什么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 ?
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)