如何仅在标志为true时触发SwiftUI动画?

inn6fuwd  于 2023-11-16  发布在  Swift
关注(0)|答案(1)|浏览(117)

我希望仅在触发器为true时触发动画,而不总是在它更改时触发动画。
我没有看到任何这样做的来源,这是可以实现的吗?

Label("Test", systemImage: "magnifyingglass")
  .keyframeAnimator(
    initialValue: AnimationValues(),
    trigger: animationIsActive
  ) { content, frame in
    content
      .scaleEffect(frame.scale)
  } keyframes: { _ in
    KeyframeTrack(\.scale) {
      LinearKeyframe(0.5, duration: 0.1)
      LinearKeyframe(1.5, duration: 0.1)
      LinearKeyframe(1.0, duration: 0.1)
    }
  }

字符串

gmxoilav

gmxoilav1#

你的意思是,动画应该只发生在布尔触发器从false变为true时,而不是从true变为false时?如果是这样,那么你可以在内容视图构建器闭包中有条件地应用缩放。
就像这样:

Label("Test", systemImage: "magnifyingglass")
    .keyframeAnimator(
        initialValue: AnimationValues(),
        trigger: animationIsActive
    ) { content, frame in
            content
                .scaleEffect(animationIsActive ? frame.scale : 1) // <- HERE
    } keyframes: { _ in
        KeyframeTrack(\.scale) {
            LinearKeyframe(0.5, duration: 0.1)
            LinearKeyframe(1.5, duration: 0.1)
            LinearKeyframe(1.0, duration: 0.1)
        }
    }

字符串
或者,如果你的意思是如果标志为true,它应该连续动画,而当标志为false时,它根本不动画,那么你只需要使用keyframeAnimator(initialValue:repeating:content:keyframes:),并以相同的方式有条件地应用缩放:

Label("Test", systemImage: "magnifyingglass")
    .keyframeAnimator(
        initialValue: AnimationValues(),
        repeating: true // <- HERE
    ) { content, frame in
            content
                .scaleEffect(animationIsActive ? frame.scale : 1)
    } keyframes: { _ in
        KeyframeTrack(\.scale) {
            LinearKeyframe(0.5, duration: 0.1)
            LinearKeyframe(1.5, duration: 0.1)
            LinearKeyframe(1.0, duration: 0.1)
        }
    }

相关问题