如何实现橡皮筋效果?

时间:2017-02-23 02:43:11

标签: ios swift uigesturerecognizer

我在网上发现这个代码在平移视图时实现了橡皮筋效果:

@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中:

enter image description here

但是,我无法理解此代码的工作原理,并在我自己的项目中重现了这种效果。例如,我不理解的一件事是,当向上平移绿色视图时yTransition将是负数而负数则没有对数(在logConstraintValueForYPoisition(:)方法中)。如果有人可以向我解释这段代码是如何逐步运作的,我将非常感激。

The original post can be found here.

1 个答案:

答案 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来执行此操作。

请注意,如果您的值为xlog(x) < x