我正在try 用旋转效果制作钟形图标的动画,但它只能单向地以指定的Angular 制作动画:

struct ContentView: View {
    @State var alarmSet = false
    
    var body: some View {
        ZStack {
            Color.black
            VStack {
                Image(systemName: "bell.fill")
                    .font(.system(size: 250))
                    .foregroundColor(.white)
                    .rotationEffect(.degrees(reminderSet ? 10 : 0), anchor: .top)
                    .animation(.interpolatingSpring(mass: 0.5, stiffness: 170, damping: 2.5, initialVelocity: 0), value: alarmSet)
                Button(action: {
                        alarmSet.toggle()
                }, label: {
                    Text(alarmSet ? "Alarm Set" : "Wake Me")
                        .font(.largeTitle)
                        .foregroundStyle(.white)
                })
                .padding(.top, 20)
            }
            .background(.black)
        }
        .ignoresSafeArea()
    }
}

使用上面的代码,钟在左侧中心之间动画,我想让它到

  1. 同样以相同的Angular 向右摆动
  2. 这样总共摆动三次,然后稳定到静止状态.插补弹簧动画使钟在进入静止状态时摆动三次以上.如有任何帮助,我们不胜感激.

推荐答案

你可以使用keyframeAnimator(iOS 17+)

Image(systemName: "bell.fill")
    .font(.system(size: 250))
    .foregroundColor(.white)
    .keyframeAnimator(initialValue: Angle.zero, trigger: alarmSet) { content, value in
        content.rotationEffect(value, anchor: .top)
    } keyframes: { _ in
        KeyframeTrack {
            let spring = Spring(mass: 0.5, stiffness: 170, damping: 2.5)
            SpringKeyframe(Angle.degrees(10), duration: 0.05, spring: spring)
            // Consider putting this part in a for loop if there are a lot of bounces
            SpringKeyframe(Angle.degrees(-10), duration: 0.1, spring: spring)
            SpringKeyframe(Angle.degrees(10), duration: 0.1, spring: spring)
            SpringKeyframe(Angle.degrees(-10), duration: 0.1, spring: spring)
            SpringKeyframe(Angle.degrees(10), duration: 0.1, spring: spring)
            // the last frame should have start velocity 0 so that it goes back to the initial position
            SpringKeyframe(Angle.zero, duration: 0.05, spring: spring, startVelocity: Angle.zero)
        }
    }

还可以考虑使用built-in springs个中的一些.

Ios相关问答推荐

StackView UIKit间距似乎非常小的编程式编程

使用UIGraphicsBeginIMAext创建新图像会扭曲图像 colored颜色

iOS中的分段拾取器—手柄点击已 Select 的项目

AlGolia InstantSearch Swift Package Manager引发编译错误

如何使用Xcode15.1在iMessage扩展模块中显示贴纸

如何从Windows PC在iPhone上安装Flutter 应用程序

NSHashTable要求任何MyCustomProtocolAnyObject都是类类型

带菜单的选取器不适用于Int32,但适用于Int

SwiftUI-工作表不显示导航标题

.frame() 修饰符的位置如何影响视图?

Apollo iOS 客户端代码生成:错误:无法查询字段

如何根据条件快速将返回类型设为 LinearGradient 或 AngularGradient?

工具栏底部 iOS 16 - SwiftUI

如何让我的 iOS 应用程序与 api 连接?

警告:iPad:Icon-72.png:图标尺寸(0 x 0)

UIScrollview 获取touch 事件

在 Swift 中禁用向后滑动手势

Select 器touchesBegan:withEvent:的覆盖方法具有不兼容的类型(NSSet,UIEvent)->()

使用 swift 从应用程序委托打开视图控制器

Info.plist 实用程序错误:无法打开 Info.plist,因为没有这样的文件