2017-02-23 11 views
0

私は、ビューをパンするときゴムバンドの効果を実現し、このコードをオンラインが見つかりました:ラバーバンド効果を実装する方法は?

@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

このコードがどのように機能し、自分のプロジェクトでこの効果を再現しているかを示します。たとえば、私が理解できないことの1つは、緑色のビューを上にパンするとyTransitionは負になり、負の数は対数を持たないことになります(logConstraintValueForYPoisition(:)メソッドで)。誰かがこのコードがどのように動作するかを私に説明することができれば、本当に感謝しています。

The original post can be found here.

+0

'UIView.animate(:usingSpringWithDamping)'を使用して、スプリングアニメーションを使用することもできます。 – Tj3n

+0

@ Tj3n:それらはそれを使用します。ログは他のもののためのものです。 – Dair

+0

春アニメーションが持つ最大オーバーポジションにログが使用していると推測します – Tj3n

答えて

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です。

関連する問題