2014年11月16日
Posted by 屋台ブルー at
2014年11月16日00:00 Comment(0)
Swiftで遊ぼう! - 128 - UIKit UIDynamicAnimator/collision
昨日まで書いたコードの場合、青い正方形はアプリが起動したとたんに重力のかかっている方向に流れて画面から消えてなくなってしまう。
次は境界線を作って青い正方形を止めるために利用するのが、UICollisionBehaviorクラスだ。すべてのUIDynamicBehaviorに言えることは、アイテムの位置情報をアレー型として保持する。UICollisionBehaviorも同じだ。
新しくインスタンスを宣言する。当然アンラップオプショナルで。
var collision: UICollisionBehavior!
そしてこのcollisionを初期化する時に画面上のオブジェクトsquareをアレー型で与える。
collision = UICollisionBehavior(items: [square])
次が重要なんですが、collisionに長ったらしい名前がついたプロパティがある。
translatesReferenceBoundsIntoBoundary
これはUIDynamicAnimatorをreferenceViewで初期化した時に初期値として設定されている境界線を使うかどうかのBoolean型プロパティってことで、初期値で設定されているのは画面の境界線でしょう。
ということで、これらを昨日のコードに付け加えると(太字が追加コード)。
import UIKit
class ViewController: UIViewController {
var animator: UIDynamicAnimator!
var gravity: UIGravityBehavior!
var collision: UICollisionBehavior!
override func viewDidLoad() {
super.viewDidLoad()
let square = UIView(frame: CGRect(x: 100, y: 100, width: 100, height: 100))
square.backgroundColor = UIColor.blueColor()
view.addSubview(square)
animator = UIDynamicAnimator(referenceView: view)
gravity = UIGravityBehavior(items: [square])
gravity.angle = 0.0
gravity.magnitude = 2.0
animator.addBehavior(gravity)
collision = UICollisionBehavior(items: [square])
collision.translatesReferenceBoundsIntoBoundary = true
animator.addBehavior(collision)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
これをiOSエミュレーターで動かすと次のように動いて止まる。angleを0.0にしているとちょうど右方向に向かって画面に当たると止まる。
しかし、これを下のように変更すると
import UIKit
class ViewController: UIViewController {
var animator: UIDynamicAnimator!
var gravity: UIGravityBehavior!
var collision: UICollisionBehavior!
override func viewDidLoad() {
super.viewDidLoad()
let square = UIView(frame: CGRect(x: 100, y: 100, width: 100, height: 100))
square.backgroundColor = UIColor.blueColor()
view.addSubview(square)
animator = UIDynamicAnimator(referenceView: view)
gravity = UIGravityBehavior(items: [square])
gravity.angle = 0.5
gravity.magnitude = 1.0
animator.addBehavior(gravity)
collision = UICollisionBehavior(items: [square])
collision.translatesReferenceBoundsIntoBoundary = true
animator.addBehavior(collision)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
面白いことに青い正方形は斜め右下に動いて画面の端に当たるとずるずると下に落ちていく。重力は下にかかっている。ちょうど真右だと静止するのにちょっt下向きだったら下に落ちていくのはどうしてでしょうね。
まあどちらにしろこういう動きが数行のコードで実現できるって凄いですね。まだまだこれから
今日はここまで。
次は境界線を作って青い正方形を止めるために利用するのが、UICollisionBehaviorクラスだ。すべてのUIDynamicBehaviorに言えることは、アイテムの位置情報をアレー型として保持する。UICollisionBehaviorも同じだ。
新しくインスタンスを宣言する。当然アンラップオプショナルで。
var collision: UICollisionBehavior!
そしてこのcollisionを初期化する時に画面上のオブジェクトsquareをアレー型で与える。
collision = UICollisionBehavior(items: [square])
次が重要なんですが、collisionに長ったらしい名前がついたプロパティがある。
translatesReferenceBoundsIntoBoundary
これはUIDynamicAnimatorをreferenceViewで初期化した時に初期値として設定されている境界線を使うかどうかのBoolean型プロパティってことで、初期値で設定されているのは画面の境界線でしょう。
ということで、これらを昨日のコードに付け加えると(太字が追加コード)。
import UIKit
class ViewController: UIViewController {
var animator: UIDynamicAnimator!
var gravity: UIGravityBehavior!
var collision: UICollisionBehavior!
override func viewDidLoad() {
super.viewDidLoad()
let square = UIView(frame: CGRect(x: 100, y: 100, width: 100, height: 100))
square.backgroundColor = UIColor.blueColor()
view.addSubview(square)
animator = UIDynamicAnimator(referenceView: view)
gravity = UIGravityBehavior(items: [square])
gravity.angle = 0.0
gravity.magnitude = 2.0
animator.addBehavior(gravity)
collision = UICollisionBehavior(items: [square])
collision.translatesReferenceBoundsIntoBoundary = true
animator.addBehavior(collision)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
これをiOSエミュレーターで動かすと次のように動いて止まる。angleを0.0にしているとちょうど右方向に向かって画面に当たると止まる。
しかし、これを下のように変更すると
import UIKit
class ViewController: UIViewController {
var animator: UIDynamicAnimator!
var gravity: UIGravityBehavior!
var collision: UICollisionBehavior!
override func viewDidLoad() {
super.viewDidLoad()
let square = UIView(frame: CGRect(x: 100, y: 100, width: 100, height: 100))
square.backgroundColor = UIColor.blueColor()
view.addSubview(square)
animator = UIDynamicAnimator(referenceView: view)
gravity = UIGravityBehavior(items: [square])
gravity.angle = 0.5
gravity.magnitude = 1.0
animator.addBehavior(gravity)
collision = UICollisionBehavior(items: [square])
collision.translatesReferenceBoundsIntoBoundary = true
animator.addBehavior(collision)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
面白いことに青い正方形は斜め右下に動いて画面の端に当たるとずるずると下に落ちていく。重力は下にかかっている。ちょうど真右だと静止するのにちょっt下向きだったら下に落ちていくのはどうしてでしょうね。
まあどちらにしろこういう動きが数行のコードで実現できるって凄いですね。まだまだこれから
今日はここまで。