iOS有相当于FastOutSlowInInterpolator的功能吗? 示例示例

问题描述

iOS是否有FastOutSlowInInterpolator的等效项?我最近接触过AndroidX,非常喜欢这个插值器。我也找到了source code,但不知道如何将其转换为iOS实现。

解决方法

如果您使用的是UIViewPropertyAnimator,则所需的曲线为.easeInOut,并且在创建动画师时可以将其作为curve的参数进行传递:

let animator = UIViewPropertyAnimator(duration: 0.4,curve: .easeInOut) {
    // Animations
}

如果您对此系统曲线不满意,可以遵循this answer并使用this handy website复制FastOutSlowInInterpolator的控制点。

FastOutSlowInInterpolator文档指出:

fast_out_slow_in对应的插值器。使用查找表 对于从(0,0)到(1,1)且控制点为P0(0, 0) P1(0.4,0)P2(0.2,1.0) P3(1.0,1.0)

因此,在您的特定情况下,您正在寻找这样的东西:

let timingParameters = UICubicTimingParameters(
    controlPoint1: CGPoint(x: 0.4,y: 0),controlPoint2: CGPoint(x: 0.2,y: 1)
)
let animator = UIViewPropertyAnimator(duration: 0.4,timingParameters: timingParameters)

或者这个:

let animator = UIViewPropertyAnimator(
    duration: 0.4,controlPoint1: CGPoint(x: 0.4,y: 1)
) {
    // Animations
}
,

SwiftUI

在SwiftUI中,您可以使用.animate修饰符来对几乎所有更改进行动画处理,并且接受曲线作为参数。我认为.interpolatingSpring(stiffness: 30,damping: 20)是您要寻找的曲线(最下面的曲线)。

示例

Demo

struct ContentView: View {
    @State var isLeading = false

    var body: some View {
        VStack {
            SpacedCircle(isLeading: $isLeading)
                .animation(.linear)

            SpacedCircle(isLeading: $isLeading)
                .animation(.easeIn)

            SpacedCircle(isLeading: $isLeading)
                .animation(.easeOut)

            SpacedCircle(isLeading: $isLeading)
                .animation(.easeInOut)

            SpacedCircle(isLeading: $isLeading)
                .animation(.interactiveSpring(response: 0.27,dampingFraction: 0.5,blendDuration: 0.2))

            SpacedCircle(isLeading: $isLeading)
                .animation(.interpolatingSpring(stiffness: 30,damping: 20))

            Button("Toggle") { isLeading.toggle() }
        }
    }
}

UIKit

您也可以在UIKit中实现类似的目的:

示例

UIKit Demo

    @IBAction func touched(_ sender: UIButton) {
        UIView.animate(withDuration: 1,delay: 0,usingSpringWithDamping: 1,initialSpringVelocity: 3,options: []) {
            self.circleView.transform = .identity
        }
    }

    @IBAction func touchDown(_ sender: Any) {
        UIView.animate(withDuration: 1,options: []) {
            self.circleView.transform = CGAffineTransform(translationX: 240,y: 0)
        }
    }

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...