将UIPanGestureRecognizer速度添加到UIViewPropertyAnimator

时间:2018-05-31 19:33:02

标签: ios uiviewanimation uipangesturerecognizer uiviewpropertyanimator

我已经学习了如何使用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 个答案:

答案 0 :(得分:0)

UISpringTimingParameters的文档说: https://developer.apple.com/documentation/uikit/uispringtimingparameters/1649832-init

  p大小为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)

让我知道这是否对您有用。