我在网上发现这个代码在平移视图时实现了橡皮筋效果:
@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(:)
方法中)。如果有人可以向我解释这段代码是如何逐步运作的,我将非常感激。
答案 0 :(得分:4)
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
。