将 UIPanGestureRecognizer 速度添加到 UIViewPropertyAnimator
Posted
技术标签:
【中文标题】将 UIPanGestureRecognizer 速度添加到 UIViewPropertyAnimator【英文标题】:add UIPanGestureRecognizer velocity to UIViewPropertyAnimator 【发布时间】:2018-05-31 19:33:02 【问题描述】:我遵循了一个关于如何使用 UIViewPropertyAnimator 创建交互式 ios 控制中心动画的教程:
http://www.swiftkickmobile.com/building-better-app-animations-swift-uiviewpropertyanimator/
向上或向下滑动底部菜单时,松开手指后,我想将平移速度添加到UIViewPropertyAnimator
并继续动画:
popupViewPanned(recognizer:)
switch recognizer.state
.
.
.
// after finger released
case .end:
// continue all animations using pan velocity with spring timing
let normalizedPanVelocity: // how to normalize pan velocity
runningAnimators.forEach $0.continueAnimation(withTimingParameters: spring(for: velocity()), durationFactor: 0)
func velocity() -> CGVector
let pan = panRecognizer
let progress = runningAnimators[0].fractionComplete
let fraction = popupOffset*(1 - progress)
return CGVector(with: pan.velocity(in: view), fraction: fraction)
func spring(for velocity: CGVector = .zero) -> UITimingCurveProvider
return UISpringTimingParameters(dampingRatio: 0.9, initialVelocity: velocity)//UISpringTimingParameters(mass: 2.5, stiffness: 80, damping: 25, initialVelocity: velocity)
问题是当我快速向上或向下滑动菜单并释放微调时,似乎动画撞到了墙上(快慢),然后继续休息
那么我该如何解决这个问题呢? 我试了一整天,但我无法修复它
【问题讨论】:
【参考方案1】:UISpringTimingParameters
的文档说:
https://developer.apple.com/documentation/uikit/uispringtimingparameters/1649832-init
大小为 1.0 的向量对应于一秒内覆盖整个动画距离的初始速度。例如,如果总动画距离为 200 点,视图的初始速度为每秒 100 点,则指定幅度为 0.5 的向量。
意味着您必须使用视图的 with 来标准化速度。
查看CGVector
的官方文档,您正在使用的初始化程序令人困惑地没有记录。
https://developer.apple.com/documentation/coregraphics/cgvector
我最终做的是自己计算归一化向量。
您需要计算视图从动画开始到结束移动的总点数,然后使用此 distanceToMove
从中制作“单位向量”/对其进行规范化:
let distanceToMove = newY - oldY
let velocity = recognizer.velocity(in: view)
let relativeVelocityY = velocity.x / distanceToMove
let relativeVelocity = CGVector(dx: 0, dy: relativeVelocityY)
let timing = UISpringTimingParameters(dampingRatio: 0.9, initialVelocity: relativeVelocity)
如果这对你有用,请告诉我。
【讨论】:
以上是关于将 UIPanGestureRecognizer 速度添加到 UIViewPropertyAnimator的主要内容,如果未能解决你的问题,请参考以下文章
将 UIPanGestureRecognizer 速度添加到 UIViewPropertyAnimator
将 UIPanGestureRecognizer 快速限制为边界
使用 UIPanGestureRecognizer 时如何将超级视图与视图一起居中?
需要在 iOS 中使用 UIPanGestureRecognizer 将 UIImageView 的移动限制在 UITableView 覆盖的区域