假设我有一个动画师将视图从 移动(0, 0)
到(-120, 0)
:
let frameAnimator = UIViewPropertyAnimator(duration: duration, dampingRatio: 0.8)
animator.addAnimations {
switch state:
case .normal: view.frame.origin.x = 0
case .swiped: view.frame.origin.x = -120
}
}
我将它与 一起使用UIPanGestureRecognizer
,这样我就可以随着手指的移动不断地调整视图的大小。
当我想在动画开始或结束时添加某种弹跳效果时,问题就来了。不仅仅是阻尼比,还有反弹效果。最简单的想象方法是滑动删除功能UITableViewCell
,您可以将“删除”按钮拖动到超出其实际宽度的位置,然后它会弹回。
实际上,我想要实现的是在段fractionComplete
之外设置属性的方法[0, 1]
,因此当分数为 时1.2
,偏移量变为144
而不是最大 120。
而现在 的最大值fractionComplete
正好是1
。
以下是一些可视化此问题的示例:
编辑(1 月 19 日):
抱歉我的延迟回复。以下是一些澄清:
我不使用UIView.animate(...)
,UIViewPropertyAnimator
而是使用一个非常具体的原因:它为我处理所有的时间、曲线和速度。
例如,您将视图拖到一半。这意味着剩余部分的持续时间应该是总持续时间的两倍。或者,如果您拖过 99% 的距离,它应该几乎立即完成剩余部分。
另外,UIViewPropertyAnimator
具有暂停(当用户再次开始拖动时)或反向(当用户开始向左拖动,但之后他改变主意并将手指向右移动时)等功能,我也从中受益.
所有这些都不适用于简单的 UIView 动画,或者充其量需要大量的努力。它只能进行简单的转换,但事实并非如此。
这就是为什么我必须使用某种动画师。
正如我在其发布者删除的答案中的评论线程中提到的那样,对我来说,这里最复杂的部分是模拟摩擦效果:拖得越远,视图实际移动的越少。就像您尝试将任何 UIScrollView 拖到其内容之外一样。
感谢您的努力,但我认为这两个答案中的任何一个都不相关。UIDynamicAnimator
只要我有时间,我就会尝试实现这种行为。可能在最近的一两周内。如果我有任何体面的结果,我会公布我的方法。
编辑(1 月 20 日):
我刚刚将一个演示项目上传到 GitHub,其中包括我在项目中拥有的所有转换。所以现在你实际上可以知道为什么我需要使用动画师以及我如何使用它们:https ://github.com/demon9733/bouncingview-prototype
您真正感兴趣的唯一文件是MainViewController+Modes.swift
. 与过渡和动画相关的所有内容都包含在其中。
我需要做的是使用户能够将手柄区域拖动到“隐藏”按钮宽度之外并具有阻尼效果。“隐藏”按钮将在向左滑动手柄区域时出现。
PS我并没有真正测试这个演示,所以它可能有我的主项目中没有的错误。所以你可以放心地忽略它们。