首页 > 解决方案 > SwiftUI / 在第一个几何动画之后移动对象

问题描述

您能否帮助更新代码以仅在第一个动画终止后将绿色图像文本“肯定有.....”移动到其原始位置上方?(例如在“切换”文本下方)谢谢,奥利维尔

您能否帮助更新代码以仅在第一个动画终止后将绿色图像文本“肯定有.....”移动到其原始位置上方?(例如就在“切换”文本下方)

        import SwiftUI
    
    
    
    struct ContentView : View {
    
        // @EnvironmentObject var showBack: Bool
       @State var showBack = false
        
        var body : some View {
            
            VStack() {
                ContentViewTest()
                Spacer()
                Text(String(self.showBack))
                }
           }
        }
        
    
    struct ContentViewTest : View {
    
          @State var showBack = false
    
          let sample1 = "If you know you have an unpleasant nature and dislike people, this is no obstacle to work."
          let sample2 = "One thing is for sure – a sheep is not a creature of the air."
    
          var body : some View {
    
                let front = CardFace(text: sample1, background: Color.yellow)
                let back = CardFace(text: sample2, background: Color.green)
                let resetBackButton = Button(action: { self.showBack = true }) { Text("Back")}.disabled(showBack == true)
            
                let resetFrontButton = Button(action: { self.showBack = false }) { Text("Front")}.disabled(showBack == false)
            
                let animatedToggle = Button(action: {
                      withAnimation(Animation.linear(duration: 0.8)) {
                            self.showBack.toggle()
                      }
                }) { Text("Toggle")}
    
    
                return
                      VStack() {
                            HStack() {
                                  resetFrontButton
                                  Spacer()
                                  animatedToggle
                                  Spacer()
                                  resetBackButton
                            }.padding()
                         Spacer()
                         Spacer()
                         Spacer()
                         Spacer()
                         FlipView(front: front, back: back, showBack: $showBack)
                }
          }
    }
    
    
    struct FlipView<SomeTypeOfViewA : View, SomeTypeOfViewB : View> : View {
    
          var front : SomeTypeOfViewA
          var back : SomeTypeOfViewB
    
          @State private var flipped = false
          @Binding var showBack : Bool
    
          var body: some View {
    
                return VStack {
                      Spacer()
    
                      ZStack() {
                            front.opacity(flipped ? 0.0 : 1.0)
                            back.opacity(flipped ? 1.0 : 0.0)
                      }
                      .modifier(FlipEffect(flipped: $flipped, angle: showBack ? 180 : 0, axis: (x: 1, y: 0)))
                      .onTapGesture {
                            withAnimation(Animation.linear(duration: 0.8)) {
                                  self.showBack.toggle()
                            }
                      }
                      Spacer()
                }
          }
    }
    
    struct CardFace<SomeTypeOfView : View> : View {
          var text : String
          var background: SomeTypeOfView
    
          var body: some View {
                Text(text)
                      .multilineTextAlignment(.center)
                      .padding(5).frame(width: 250, height: 150).background(background)
          }
    }
    
    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 {
    
                DispatchQueue.main.async {
                      self.flipped = self.angle >= 90 && self.angle < 270
                }
    
                let tweakedAngle = flipped ? -180 + angle : angle
                let a = CGFloat(Angle(degrees: tweakedAngle).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)
          }
    }
    
    
    struct ContentView_Previews: PreviewProvider {
        static var previews: some View {
            ContentView()
        }
    }

标签: swiftui

解决方案


推荐阅读