SwiftUI 动画通常由状态驱动,这很好,但有时您确实想触发临时(通常是可逆的)动画来响应某些事件。例如,我想在点击按钮时暂时增加按钮的大小(释放按钮时大小的增加和减小都应作为单个动画发生),但我无法弄清楚这一点。
我认为它可以与转换结合在一起,但不是很好。另外,如果我制作一个使用自动反转的动画,它会增加大小,减小大小,然后跳回到增加的状态。
这也是我所热衷的事情。
到目前为止,我的解决方案取决于应用几何效果修饰符并滥用其方法这一事实效果值在某些动画期间连续调用。因此,期望的效果实际上是从 0..1 开始的插值的变换,在 0.5 中具有主要效果,在 0 或 1 中没有效果
它工作得很好,它适用于所有视图而不仅仅是按钮,不需要依赖触摸事件或按钮样式,但在我看来仍然有点像黑客。
随机旋转和缩放效果的示例:
代码示例:
struct ButtonEffect: GeometryEffect {
var offset: Double // 0...1
var animatableData: Double {
get { offset }
set { offset = newValue }
}
func effectValue(size: CGSize) -> ProjectionTransform {
let effectValue = abs(sin(offset*Double.pi))
let scaleFactor = 1+0.2*effectValue
let affineTransform = CGAffineTransform(rotationAngle: CGFloat(effectValue)).translatedBy(x: -size.width/2, y: -size.height/2).scaledBy(x: CGFloat(scaleFactor), y: CGFloat(scaleFactor))
return ProjectionTransform(affineTransform)
}
}
struct ButtonActionView: View {
@State var animOffset: Double = 0
var body: some View {
Button(action:{
withAnimation(.spring()) {
self.animOffset += 1
}
})
{
Text("Press ME")
.padding()
}
.background(Color.yellow)
.modifier(ButtonEffect(offset: animOffset))
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)