Howard
Howard

Reputation: 3848

Why the "RemoveAllAnimations()" doesn't stop my animation?

I have a very simple sample that allows to drag an UIView around. When touch up, I will have an inertia effect on the dragging direction for a second. While if I touch down again, I need to stop all the inertia animation and start to do another drag. Here is my code, the "clearAllAnimations" doesn't stop my animation. How could I implement that?

import UIKit

class ViewController: UIViewController {
    var tile : UIView = UIView()
    var labelView = UITextView()
    var displayLink : CADisplayLink?

    override func viewDidLoad() {
        super.viewDidLoad()

        tile.frame = CGRect(x: 0, y: 0, width: 256, height: 256)
        tile.backgroundColor = UIColor.redColor()
        view.addSubview(tile)

        var panGesture = UIPanGestureRecognizer(target: self, action: Selector("panHandler:"))
        view.addGestureRecognizer(panGesture)

        labelView.frame = CGRect(x: 0, y: 100, width: view.frame.width, height: 44)
        labelView.backgroundColor = UIColor.clearColor()
        view.addSubview(labelView)
    }

    func panHandler (p: UIPanGestureRecognizer!) {
        var translation = p.translationInView(view)
        if (p.state == UIGestureRecognizerState.Began) {
            self.tile.layer.removeAllAnimations()
        }
        else if (p.state == UIGestureRecognizerState.Changed) {
            var offsetX = translation.x
            var offsetY = translation.y

            var newLeft = tile.frame.minX + offsetX
            var newTop = tile.frame.minY + offsetY

            self.tile.frame = CGRect(x: newLeft, y: newTop, width: self.tile.frame.width, height: self.tile.frame.height)
            labelView.text = "x: \(newLeft); y: \(newTop)"
            p.setTranslation(CGPoint.zeroPoint, inView: view)
        }
        else if (p.state == UIGestureRecognizerState.Ended) {
            var inertia = p.velocityInView(view)
            var offsetX = inertia.x * 0.2
            var offsetY = inertia.y * 0.2
            var newLeft = tile.frame.minX + offsetX
            var newTop = tile.frame.minY + offsetY

            UIView.animateWithDuration(1, delay: 0, options:UIViewAnimationOptions.CurveEaseOut, animations: {_ in
                self.tile.frame = CGRect(x: newLeft, y: newTop, width: self.tile.frame.width, height: self.tile.frame.height)
                }, completion: nil)

        }
    }
}

Upvotes: 0

Views: 850

Answers (1)

Howard
Howard

Reputation: 3848

Setting UIViewAnimationOptions.AllowUserInteraction does the trick. The new code to start animation is this:

UIView.animateWithDuration(animationDuration, delay: 0, options:UIViewAnimationOptions.CurveEaseOut | UIViewAnimationOptions.AllowUserInteraction | UIViewAnimationOptions.BeginFromCurrentState, animations: {_ in
            self.tile.frame = CGRect(x: newLeft, y: newTop, width: self.tile.frame.width, height: self.tile.frame.height)
            }, completion: nil)

Upvotes: 1

Related Questions