SwiftUI |动画此路径形状

时间:2020-10-20 13:32:40

标签: ios swift animation swiftui

我有以下情况:

我想用自定义动画翻转此形状。我不知道如何正确地描述它。

每当我点击箭头时,它应该转换到另一个箭头。无需翻转,旋转等,只需进行转换即可。

如果不够精确,请随时发表评论!

演示代码

struct ContentView: View {
    
    @State private var change = false
    
    private let arrowWidth: CGFloat = 80
    
    
    var body: some View {
        Path { path in
            path.move(to: .zero)
            path.addLine(to: CGPoint(x: arrowWidth/2, y: change ? -20 : 20))
            path.move(to: CGPoint(x: arrowWidth/2, y: change ? -20 : 20))
            path.addLine(to: CGPoint(x: arrowWidth, y: 0))
        }
        .stroke(style: StrokeStyle(lineWidth: 12, lineCap: .round))
        .frame(width: arrowWidth)
        .foregroundColor(.green)
        .animation(.default)
        .onTapGesture { change.toggle() }
        .padding(.top, 300)
    }
}

您现在可以看到它没有动画。我不知道该怎么做。

我们非常感谢您的帮助。谢谢!

注意:我无法使用两个圆角矩形+简单旋转来实现此目的,因为我有一个不透明动画,该动画使重叠可见。

1 个答案:

答案 0 :(得分:7)

这里是可行的方法-将路径移动到自定义形状,并将更改的参数设置为可设置动画的属性。经过Xcode 12 / iOS 14的测试

demo

struct MyArrow: Shape {
    var width: CGFloat
    var offset: CGFloat
    
    var animatableData: CGFloat {
        get { offset }
        set { offset = newValue }
    }
    
    func path(in rect: CGRect) -> Path {
        Path { path in
            path.move(to: .zero)
            path.addLine(to: CGPoint(x: width/2, y: offset))
            path.move(to: CGPoint(x: width/2, y: offset))
            path.addLine(to: CGPoint(x: width, y: 0))
        }
    }
}

struct ContentView: View {
    
    @State private var change = false
    
    private let arrowWidth: CGFloat = 80
    
    
    var body: some View {
        MyArrow(width: arrowWidth, offset: change ? -20 : 20)
        .stroke(style: StrokeStyle(lineWidth: 12, lineCap: .round))
        .frame(width: arrowWidth)
        .foregroundColor(.green)
        .animation(.default)
        .onTapGesture { change.toggle() }
        .padding(.top, 300)
    }
}