0

アプリを起動すると、UILabel が落ちて、上に移動してそこにとどまることがわかります。落ちないのはなぜ?要素を移動した後に GravityBehavior を作成するにはどうすればよいですか?

 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
            }
        }
    }
4

1 に答える 1

0

あなたがしたことはすべて正しいことです。変更する必要があるのは、パンジェスチャ状態が終了したら、重力動作を再度追加する必要があることだけです。変更したコードを以下に示します

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()
    }
}

上記のコードはあなたの期待を満たします。ベスト プラクティスは、新しいものを追加する前に、アニメーターanimator.removeAllBehaviors()から以前の動作を削除することです。

于 2016-05-12T10:16:12.770 に答える