UIGravityBehavior do not work after move item

146 views Asked by At

When I start my app I see that UILabel falls down, then I move it to up and it stay there. Why does it not fall? How make GravityBehavior after move element?

 class ViewController: UIViewController
    {
        var helloWorldLabel: UILabel!
        var panGestureRecognizer: UIPanGestureRecognizer!
        var animator: UIDynamicAnimator!

        override func viewDidLoad()
        {
            super.viewDidLoad()
            var str:NSString = "Hello World"
            let labelFrame = CGRect(x: 0, y: 0, width:200, height: 100);
            helloWorldLabel = UILabel(frame: labelFrame)
            helloWorldLabel.userInteractionEnabled = true
            helloWorldLabel.text = str as String
            helloWorldLabel.frame = labelFrame;
            helloWorldLabel.backgroundColor = UIColor.grayColor()
            helloWorldLabel.center = view.center
            view.addSubview(helloWorldLabel)
            panGestureRecognizer = UIPanGestureRecognizer(target: self,action: "handlePanGestures:")
            helloWorldLabel.addGestureRecognizer(panGestureRecognizer)
            animator = UIDynamicAnimator(referenceView: view)
            let collisionBehavior = UICollisionBehavior(items: [helloWorldLabel])
            collisionBehavior.translatesReferenceBoundsIntoBoundary = true
            animator.addBehavior(collisionBehavior)
            let gravityBehavior =  UIGravityBehavior(items: [helloWorldLabel])
            animator.addBehavior(gravityBehavior)

        }

        func handlePanGestures(sender: UIPanGestureRecognizer)
        {
            if sender.state != .Ended && sender.state != .Failed
            {
                let location = sender.locationInView(sender.view!.superview!)
sender.view!.center = location
            }
        }
    }
1

There are 1 answers

0
Gokul G On

Everything you did is right only thing you have to change is once the pangesture state is ended you have to add gravity behaviour again.Code i have modified is given below

class JsonParser: UIViewController {

var animator: UIDynamicAnimator!
var helloWorldLabel: UILabel!
var panGestureRecognizer: UIPanGestureRecognizer!

override func viewDidLoad() {
    super.viewDidLoad()
    let str:NSString = "Hello World"
    let labelFrame = CGRect(x: 0, y: 0, width:200, height: 100);
    helloWorldLabel = UILabel(frame: labelFrame)
    helloWorldLabel.userInteractionEnabled = true
    helloWorldLabel.text = str as String
    helloWorldLabel.frame = labelFrame;
    helloWorldLabel.backgroundColor = UIColor.grayColor()
    helloWorldLabel.center = view.center
    view.addSubview(helloWorldLabel)
    panGestureRecognizer = UIPanGestureRecognizer(target: self,action: "handlePanGestures:")
    helloWorldLabel.addGestureRecognizer(panGestureRecognizer)
    animator = UIDynamicAnimator(referenceView: view)
    AddCollisionAndGravity()

func AddCollisionAndGravity () {
    animator.removeAllBehaviors()

    let collisionBehavior = UICollisionBehavior(items: [helloWorldLabel])
    collisionBehavior.translatesReferenceBoundsIntoBoundary = true
    animator.addBehavior(collisionBehavior)
    let gravityBehavior =  UIGravityBehavior(items: [helloWorldLabel])
    animator.addBehavior(gravityBehavior)

}

func handlePanGestures(sender: UIPanGestureRecognizer)
{
    if sender.state != .Ended && sender.state != .Failed
    {
        let location = sender.locationInView(sender.view!.superview!)
        sender.view!.center = location
    }else if sender.state == UIGestureRecognizerState.Ended{

       AddCollisionAndGravity()
    }
}

The above code will fullfill your expectations. Best practice is to remove previous behaviour from animator animator.removeAllBehaviors() before adding the new one.I hope this may help you.