2014年11月19日
Posted by 屋台ブルー at
2014年11月19日00:00 Comment(0)
Swiftで遊ぼう! - 131 - UIDynamicAnimator/collisionインタラクション色々
UICollisionBehaviorクラスにも数多くのプロパティやメソッドが用意されている。iOSフレームワークを勉強するのが大変なのは覚えることが多すぎるからだ。
UIDynamicBehaviorの1つ、UICollisionBehaviorクラスにも知らないプロパティやメソッドが色々ある。
また昨日紹介したコードの話をしよう(毎日ちょっとずつしか勉強していないんで、同じ内容を数日続けてるので)。青い正方形が重力に従って落下する途中に黄色い長方形にぶつかる(Collision!)と、その落下速度に影響して2つのオブジェクトが一緒に落下していく。
これじゃ、黄色い長方形にbarrier(バリア)と名付けた意味がないですよね。黄色い長方形は青い正方形と衝突しても影響をうけないようにするにはどうすればいいか?
答えは、黄色い長方形の輪郭に合わせて透明の境界線を引いてやるんですよ。
collision.translatesReferenceBoundsIntoBoundary = true
このコードを覚えているかな。このプロパティを「true」にしてやると、リファレンスビュー(referennce view)、これは画面の輪郭になるけど、これが境界線になる。ここに黄色い長方形の輪郭を境界線として加えてやるメソッドを使うんです。
collision.addBoundaryWithIdentifier("barrier", forPath: UIBezierPath(rect: barrier.frame))
これも覚えなければならないメソッドの作法だ。こういうメソッドが多数あるんで、どういう時にどういうメソッドを使ったらいいのか勉強するために、他人のコードを読むことが重要になりますね。覚えるより慣れろってところか。
じゃあViewController.swiftのコードを紹介しよう。
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)
let barrier = UIView(frame: CGRect(x: 0, y: 300, width: 130, height: 20))
barrier.backgroundColor = UIColor.yellowColor()
view.addSubview(barrier)
animator = UIDynamicAnimator(referenceView: view)
gravity = UIGravityBehavior(items: [square])
animator.addBehavior(gravity)
collision = UICollisionBehavior(items: [square])
collision.addBoundaryWithIdentifier("barrier", forPath: UIBezierPath(rect: barrier.frame))
collision.translatesReferenceBoundsIntoBoundary = true
animator.addBehavior(collision)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
このコードないで記述しているオブジェクトの腱錬成をダイアグラムで説明すると下のようになる。
これをiOSシュミレーターで実行すると黄色い長方形は動かず、青し正方形は落下中に黄色い長方形に当たって落下の軌跡が変わる。
今日はここまで。
UIDynamicBehaviorの1つ、UICollisionBehaviorクラスにも知らないプロパティやメソッドが色々ある。
また昨日紹介したコードの話をしよう(毎日ちょっとずつしか勉強していないんで、同じ内容を数日続けてるので)。青い正方形が重力に従って落下する途中に黄色い長方形にぶつかる(Collision!)と、その落下速度に影響して2つのオブジェクトが一緒に落下していく。
これじゃ、黄色い長方形にbarrier(バリア)と名付けた意味がないですよね。黄色い長方形は青い正方形と衝突しても影響をうけないようにするにはどうすればいいか?
答えは、黄色い長方形の輪郭に合わせて透明の境界線を引いてやるんですよ。
collision.translatesReferenceBoundsIntoBoundary = true
このコードを覚えているかな。このプロパティを「true」にしてやると、リファレンスビュー(referennce view)、これは画面の輪郭になるけど、これが境界線になる。ここに黄色い長方形の輪郭を境界線として加えてやるメソッドを使うんです。
collision.addBoundaryWithIdentifier("barrier", forPath: UIBezierPath(rect: barrier.frame))
これも覚えなければならないメソッドの作法だ。こういうメソッドが多数あるんで、どういう時にどういうメソッドを使ったらいいのか勉強するために、他人のコードを読むことが重要になりますね。覚えるより慣れろってところか。
じゃあViewController.swiftのコードを紹介しよう。
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)
let barrier = UIView(frame: CGRect(x: 0, y: 300, width: 130, height: 20))
barrier.backgroundColor = UIColor.yellowColor()
view.addSubview(barrier)
animator = UIDynamicAnimator(referenceView: view)
gravity = UIGravityBehavior(items: [square])
animator.addBehavior(gravity)
collision = UICollisionBehavior(items: [square])
collision.addBoundaryWithIdentifier("barrier", forPath: UIBezierPath(rect: barrier.frame))
collision.translatesReferenceBoundsIntoBoundary = true
animator.addBehavior(collision)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
このコードないで記述しているオブジェクトの腱錬成をダイアグラムで説明すると下のようになる。
これをiOSシュミレーターで実行すると黄色い長方形は動かず、青し正方形は落下中に黄色い長方形に当たって落下の軌跡が変わる。
今日はここまで。