добавить скорость UIPanGestureRecognizer в UIViewPropertyAnimator - PullRequest
0 голосов
/ 31 мая 2018

Я ознакомился с руководством по созданию интерактивной анимации центра управления iOS с помощью UIViewPropertyAnimator:

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 голосов
/ 29 сентября 2018

Документация для UISpringTimingParameters гласит: https://developer.apple.com/documentation/uikit/uispringtimingparameters/1649832-init

Вектор с величиной 1,0 соответствует начальной скорости, которая покрывает общее расстояние анимации за одну секунду.Например, если общее расстояние анимации составляет 200 точек, а начальная скорость просмотра составляет 100 точек в секунду, укажите вектор с величиной 0,5.

Это означает, что вы должны нормализовать скорость, используяс точки зрения.

И, глядя на официальную документацию по 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)

Дайте мне знать, если это сработало для вас.

...