我已经学习了如何使用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)
}
问题是,当我快速向上或向下滑动菜单并释放更精细时,似乎动画撞到墙上(速度很慢),然后继续休息
那么我该如何解决这个问题呢? 我已经尝试了一整天,但我无法解决它
答案 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)
让我知道这是否对您有用。