2017-10-24 8 views
0

画面の上部から開始し、画面の下部に落ちてそこにとどまるスワイプで正方形を作成したいと思います。私はまた、上に向かって指でそれをドラッグして、画面の下に向かって再び落とすことができるようにしたいと思います。それを行う方法に関するヒント?重力/衝突/弾性を持つSwiftのオブジェクト(UIView)を既に移動しています

すでにスクリーンの下に向かって四角形を作成することができました。私も指でそれを動かすことができました。しかし、問題は、私がそれを動かすたびに、正方形がちょうど同じ場所にとどまることです。私がそれを動かすと、重力/衝突/弾力性は働かないようです。私は正方形から私の指を持ち上げた後にそれが落ちるようにしたい。私のコードの抜粋については以下を参照してください。おそらく、私が見逃してしまう単純なものがあります。任意のヒントをいただければ幸いです。

import UIKit 

class ViewController: UIViewController { 

    var greenSquare: UIView? 
    var redSquare:UIView? 
    var animator: UIDynamicAnimator? 

    override func viewDidLoad() { 
    super.viewDidLoad() 
    createFallingObject() 

    func createFallingObject() { 

    //remove square from superview 
    redSquare?.removeFromSuperview() 

    //create the shape 
    var dimen = CGRect(x: 130,y: 25,width: 90,height: 90) 
    redSquare = UIView(frame: dimen) 
    redSquare?.backgroundColor = UIColor.red 

    //then add to the screen 
    self.view.addSubview(redSquare!) 

    //Initialize the animator 
    animator = UIDynamicAnimator(referenceView: self.view) 

    //Add gravity to the squares 
    let gravity = UIGravityBehavior(items: [redSquare!]) 
    let direction = CGVector(dx: 0.0, dy: 0.05) 
    gravity.gravityDirection = direction 

    //Collision 
    let boundaries = UICollisionBehavior(items: [redSquare!]) 
    boundaries.translatesReferenceBoundsIntoBoundary = true 

    //Elasticity 
    let bounce = UIDynamicItemBehavior(items: [redSquare!]) 
    bounce.elasticity = 0.3 



    // 1. create a gesture recognizer (tap gesture) 
    let tapGesture = UITapGestureRecognizer(target: self, action: #selector(handleTap(sender:))) 


    //add pan gesture Regcognizer to the red square 
    let panGestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(handlePan)) 
    redSquare?.addGestureRecognizer(panGestureRecognizer) 


    animator?.addBehavior(boundaries) 
    animator?.addBehavior(bounce) 
    animator?.addBehavior(gravity) 
    } 

    //this method handle pan 
    func handlePan(_ gestureRecognizer: UIPanGestureRecognizer) { 
    if gestureRecognizer.state == .began || gestureRecognizer.state == .changed { 

     let translation = gestureRecognizer.translation(in: self.view) 
     // note: 'view' is optional and need to be unwrapped 
     gestureRecognizer.view!.center = CGPoint(x: gestureRecognizer.view!.center.x + translation.x, y: gestureRecognizer.view!.center.y + translation.y) 
     gestureRecognizer.setTranslation(CGPoint.zero, in: self.view) 

     //redSquare?.frame.origin.x = translation.x 
     //redSquare?.frame.origin.y = translation.y 
    } 
    } 

    // 3. this method is called when a tap is recognized 
    func handleTap(sender: UITapGestureRecognizer) { 
    createFallingObject() 
    } 
} 

答えて

0

あなたはパンジェスチャが始まるときUIDynamicAnimatorから項目を削除し、それが終了したときに、それを再度追加する必要があります。

ダイナミックアニメータにビューを追加するとき、その位置はアニメータとアニメータだけで判断する必要があります。アニメータからアイテムを削除すると、フレームを使用してビューが正常に配置されます。それをアニメーターに戻すと、アニメーターは現在の状態からアニメーターの位置を再開します。

また、アイテムの位置を手動で更新する必要がある場合(つまり、アニメータの物理に基づいていない場合)は、animator.updateItem(usingCurrentState: myDynamicItem)と呼びます(myDynamicItemは更新するアイテムです)。

0

ありがとう、beyowulf。 animator?.removeAllBehavior()は、パンジェスチャールーチンのトリックを実行しました

関連する問題