如何实现橡皮筋效果?
问题描述:
我发现这个代码线上平移视图时实现该橡胶带效应:如何实现橡皮筋效果?
@IBAction func viewDragged(sender: UIPanGestureRecognizer) {
let yTranslation = sender.translationInView(view).y
if (hasExceededVerticalLimit(topViewConstraint.constant)){
totalTranslation += yTranslation
topViewConstraint.constant = logConstraintValueForYPoisition(totalTranslation)
if(sender.state == UIGestureRecognizerState.Ended){
animateViewBackToLimit()
}
} else {
topViewConstraint.constant += yTranslation
}
sender.setTranslation(CGPointZero, inView: view)
}
func logConstraintValueForYPoisition(yPosition : CGFloat) -> CGFloat {
return verticalLimit * (1 + log10(yPosition/verticalLimit))
}
所得效果示于下面的GIF:
然而,我有麻烦理解代码如何工作,并在我自己的项目中再现这种效果。例如,我不明白的一件事是,向上平移绿色视图时yTransition
将是负数,负数不会有对数(在logConstraintValueForYPoisition(:)
方法中)。如果有人能够向我解释这段代码如何一步一步地工作,我会非常感激。
答
的log
是不是你在想什么。事实上,片段并不完整。回购可以找到here。
弹跳动画是here:
func animateViewBackToLimit() {
self.topViewConstraint.constant = self.verticalLimit
UIView.animateWithDuration(0.5, delay: 0, usingSpringWithDamping: 0.3, initialSpringVelocity: 10, options: UIViewAnimationOptions.AllowUserInteraction, animations: {() -> Void in
self.view.layoutIfNeeded()
self.totalTranslation = -200
}, completion: nil)
}
的log
部是用于使绿色矩形起来。一旦达到向上阈值(hasExceededVerticalLimit(topViewConstraint.constant)
),您希望矩形停止移动的速度尽可能快,因为您不希望它跟上手指,请通过拨打logConstraintValueForYPoisition
来完成此操作。
请注意,如果你有一个正值x
,log(x) < x
。
你可以使用'UIView.animate(:usingSpringWithDamping)'也有弹簧动画 – Tj3n
@ Tj3n:他们确实使用它。日志是为了别的。 – Dair
猜测日志正在用于弹簧动画所具有的最大位置 – Tj3n