【发布时间】:2020-03-29 02:06:36
【问题描述】:
SwiftUI 不仅为我们提供了自动动画……它还允许我们使用 animatableData 属性控制动画的发生方式。太酷了!
只有我不能让它工作。以下代码在屏幕上显示一个钟面(数字 0…11 ????)并显示一个拨动开关。切换开关将数字旋转 180 度,动画。或者这就是我的意图。但是不是每个数字都围绕数字圈走一条动画路径,而是每个数字沿着一条直线移动到它的新位置……所以数字圈塌陷到圆圈的中心点,然后重新爆炸成它的新配置:
animatableData 属性未被 SwiftUI 引用。知道为什么吗?
(请注意,使用标准的旋转动画是行不通的,因为这会使所有的数字都颠倒过来。)
import SwiftUI
struct ContentView: View {
@State var state: Bool = false
var body: some View {
VStack {
CircleView(hoursOffset: CGFloat(state ? 6 : 0 ))
.aspectRatio(contentMode: .fit)
Toggle(isOn: $state, label: { Text("Rotate 180°?") })
.frame(maxWidth: 200).padding()
}
}
}
extension CGPoint {
static func onCircle(hours: CGFloat, size: CGFloat) -> CGPoint {
let radians = (3 - hours) * CGFloat.pi / CGFloat (6)
let hypotenuse = size / 2
return CGPoint(x: size / 2 + 0.8 * hypotenuse * cos(radians),
y: size / 2 - 0.8 * hypotenuse * sin(radians))
}
}
struct CircleView: View {
var hoursOffset: CGFloat
public var animatableData: CGFloat {
get { hoursOffset }
set { self.hoursOffset = newValue }
}
var body: some View {
GeometryReader() { geo in
ForEach(0..<12) { hour in
ZStack {
Text("\(hour)")
.position(CGPoint.onCircle(hours: CGFloat(hour) + self.hoursOffset, size: geo.size.width))
.animation(Animation.easeInOut(duration: 2.0))
}
}
}
}
}
【问题讨论】:
标签: ios animation rotation swiftui