Swiftui 制作动画';s速度

Swiftui 制作动画';s速度,swiftui,Swiftui,我想要一个旋转记录的效果,只要它开始和停止旋转,它就会变得轻松。在触发器下面的代码中是isRotatingBool 但是我想动画的速度是不可能的 struct PausableRotatingButtonStyle:ButtonStyle{ 变量旋转:布尔 @国家-私人var速度:双=1.0 @国家私有变量度:双=0.0 var预测:动画{ 动画。线性(持续时间:2) .repeatForever(自动反转:false) .速度(速度) } func makeBody(配置:配置)->一些视图{

我想要一个旋转记录的效果,只要它开始和停止旋转,它就会变得轻松。在触发器下面的代码中是
isRotating
Bool

但是我想动画的速度是不可能的

struct PausableRotatingButtonStyle:ButtonStyle{
变量旋转:布尔
@国家-私人var速度:双=1.0
@国家私有变量度:双=0.0
var预测:动画{
动画。线性(持续时间:2)
.repeatForever(自动反转:false)
.速度(速度)
}
func makeBody(配置:配置)->一些视图{
VStack{
文本(“速度:\(速度.说明)”)
配置标签
.旋转效应(角度(度:度))
.动画(预测准确性)
奥纳佩尔先生{
度=360.0
}
.onChange(of:isRotating){中的值
带动画(.linear){
速度=值?1:0
}
}
}
}
}
结构测试旋转按钮样式预览:预览提供程序{
静态var预览:一些视图{
TestRotatingButtonStyle()
}
结构测试旋转按钮样式:视图{
@国家私有变量显示:Bool=true
var body:一些观点{
VStack{
钮扣{
isPlaying.toggle()
}标签:{

Text(如果
.easeOut
.spring
选项不剪切它,您可以制作计时曲线。此函数接受两点(c0、c1)的x和y值

这些点定义了(选择心智模型动词:stretch/form/define)动画起点和终点之间立方体动画计时曲线的锚点。(就像在0,0和1,1之间绘制路径一样。如果这听起来仍然像胡言乱语,请查看下面的objc.io链接以获取视觉效果。)

图像(“车轮”)
.动画(.timingCurve(0,0.5,0.25,1,持续时间:2))
缓进-缓出型曲线可以是
.timingCurve(0.17,0.67,0.83,0.67)

您可以通过objc.io了解更多信息。

编辑回复:关于速度的评论 虽然计时是预期的API,但您可能能够更改速度以响应GeometryEffect progress reporter的绑定

在下面的动画中,我根据垂直正弦波传播几何效应的进度应用或移除球下的阴影。进度值介于0和1之间。(起飞/飞行/着陆由另一个布尔值和x轴偏移的动画曲线实现。)

[

///Ball
.修饰符(使用ProgressBinding反弹)(
currentEffect:$currentEffectSize,//%完成
轴:。垂直,
offsetMax:flightHeight,
交互过程:迭代
).ignoredByLayout())

具有ProgressBinding的结构反弹:GeometryEffect{
@绑定变量currentEffect:CGFloat/%完成
变量轴:轴
var offsetMax:CGFloat
var InteractionProgress:Double
var animatableData:Double{
获取{interactionprogress}
设置{interactionprogress=newValue}
}
func effectValue(大小:CGSize)->ProjectionTransform{
让进度=互动进度-楼层(互动进度)
设curvePosition=cos(2*进度*.pi)
let effectSize=(曲线位置+1)/(.pi*1.25)
let translation=offsetMax*CGFloat(1-效应大小)
DispatchQueue.main.async{currentEffect=CGFloat(1-effectSize)}
如果轴==。水平{
返回ProjectOnTransform(CGAffineTransform(translationX:translation,y:0))
}否则{
返回ProjectOnTransform(CGAffineTransform(translationX:0,y:translation))
}
}
}

那么
.easeInOut
动画呢?@George\E目标是将动画的
速度值从0.0设置为1.0。这根本不起作用……也不适用于
。easeInOut
。@TD540什么意思?.easeInOut“根本不起作用”?有.timingCurve API和作为选项侦听GeometryEffect进度,但预设的计时曲线“根本不工作”听起来很奇怪也很有趣。如果你想让轮子旋转加速然后减速,.timingCurve,.easeInOut和custom.springs对我来说很有效。速度只是一个API,可以在系统持续时间和用户指定的持续时间之间工作。不是说
。easeInOut
不起作用。我的意思是它的速度值不可设置动画。目标是对于连续线性旋转记录,当
isplay
变为
true
时,开始时逐渐加速,当
isplay
切换为
false
时,停止时逐渐减速。