Guy Javier 在这个博客上描述了如何使用 GeometryEffect 来获得动画反馈,在他的示例中,他检测到动画何时达到 50%,因此他可以翻转视图并使其看起来像有 2 个边
这里有很多解释的全文链接:https://swiftui-lab.com/swiftui-animations-part2/
我将在此处复制相关的 sn-ps,因此即使链接不再有效,答案仍然可以相关:
在此示例中,@Binding var flipped: Bool 在角度介于 90 和 270 之间时变为真,然后变为假。
struct FlipEffect: GeometryEffect {
var animatableData: Double {
get { angle }
set { angle = newValue }
}
@Binding var flipped: Bool
var angle: Double
let axis: (x: CGFloat, y: CGFloat)
func effectValue(size: CGSize) -> ProjectionTransform {
// We schedule the change to be done after the view has finished drawing,
// otherwise, we would receive a runtime error, indicating we are changing
// the state while the view is being drawn.
DispatchQueue.main.async {
self.flipped = self.angle >= 90 && self.angle < 270
}
let a = CGFloat(Angle(degrees: angle).radians)
var transform3d = CATransform3DIdentity;
transform3d.m34 = -1/max(size.width, size.height)
transform3d = CATransform3DRotate(transform3d, a, axis.x, axis.y, 0)
transform3d = CATransform3DTranslate(transform3d, -size.width/2.0, -size.height/2.0, 0)
let affineTransform = ProjectionTransform(CGAffineTransform(translationX: size.width/2.0, y: size.height / 2.0))
return ProjectionTransform(transform3d).concatenating(affineTransform)
}
}
您应该能够将动画更改为您想要实现的任何内容,然后在完成后获取绑定以更改父级的状态。