如何解决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)
是您要寻找的曲线(最下面的曲线)。
示例
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中实现类似的目的:
示例
@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)
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。