【发布时间】:2020-01-10 15:37:48
【问题描述】:
假设我有一个动画师将视图从(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 的 Swipe-To-Delete 功能,您可以将“删除”按钮拖动到超出其实际宽度的位置,然后它会弹回。
实际上我想要实现的是在[0, 1] 段之外设置fractionComplete 属性的方法,因此当分数为1.2 时,偏移量变为144 而不是其最大值120。
现在fractionComplete 的最大值正好是1。
以下是一些可视化此问题的示例:
编辑(1 月 19 日):
抱歉,我的回复延迟了。以下是一些说明:
我不使用UIView.animate(...),而是使用UIViewPropertyAnimator,原因非常具体:它为我处理所有的时间、曲线和速度。
例如,您将视图拖到一半。这意味着剩余部分的持续时间应该是总持续时间的两倍。或者,如果您拖过 99% 的距离,它应该几乎立即完成剩余部分。
另外,UIViewPropertyAnimator 具有暂停(当用户再次开始拖动时)或反向(当用户开始向左拖动,但之后他改变主意并向右移动手指)等功能,我也从中受益。
所有这些都不适用于简单的 UIView 动画,或者充其量需要大量的努力。它只能进行简单的转换,而事实并非如此。
这就是为什么我必须使用某种动画师。
正如我在其发布者删除的答案中的 cmets 线程中所提到的,对我来说,这里最复杂的部分是模拟摩擦效果:拖得越远,视图实际移动的越少。就像您尝试将任何 UIScrollView 拖到其内容之外一样。
感谢您的努力,但我认为这两个答案中的任何一个都不相关。只要有时间,我将尝试使用UIDynamicAnimator 来实现此行为。可能在最近的一两周内。如果我有任何不错的结果,我会公布我的方法。
编辑(1 月 20 日):
我刚刚将一个演示项目上传到 GitHub,其中包括我在项目中拥有的所有转换。所以现在您实际上可以知道为什么我需要使用动画师以及我如何使用它们:https://github.com/demon9733/bouncingview-prototype
您真正感兴趣的唯一文件是MainViewController+Modes.swift。与过渡和动画相关的所有内容都包含在其中。
我需要做的是使用户能够将手柄区域拖动到“隐藏”按钮宽度之外并具有阻尼效果。向左滑动手柄区域会出现“隐藏”按钮。
附:我没有真正测试这个演示,所以它可能有我的主项目中没有的错误。所以你可以放心地忽略它们。
【问题讨论】:
-
这不是默认行为吗?
-
@julian-silvestri 这是
UITableViewCell的默认行为。但我正在尝试使用常规UIView实现这样的动画,使用UIViewPropertyAnimator。 -
经过一番研究,我发现了这个框架:
UIDynamicAnimator。但我仍然不确定它是否能够制作弹跳动画。 -
您能否通过打印声明确认当您滑动时,您实际上是在击中“滑动”的情况
-
@julian-silvestri 我不明白你的问题。第二张图片(我想要实现的)是
UITableViewCell滑动时的默认行为。第一张图片是我的常规UIView,我想在其中模仿这种反弹效果。问题是,我怎样才能在UIView而不是UITableViewCell中获得这种反弹效果?
标签: swift animation uipangesturerecognizer bounce uiviewpropertyanimator