将 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 覆盖的区域

将 UIPanGestureRecognizer 应用于同一个按钮时如何访问 uibutton

您需要采取哪些步骤将 UIPanGestureRecognizer 触摸转换为 ScrollView 缩放?