ええい!ってなったときに、
UIViewを全部落下させてみるのもいいかもしれません。
iOS7から使えるようになったUIKit Dynamicsを使えば結構簡単です。
そこで、ちょっと息抜きにSORDynamicAnimator(後述)なるクラスを作ってみました。
使い方はカンタン。
そっと2行書くだけ・・・。
ViewController.swift
class ViewController: UIViewController {
//アニメーション中は保持する必要があります
var animator : SORDynamicAnimator?
override func viewDidLoad() {
super.viewDidLoad()
// アニメータ初期化
self.animator = SORDynamicAnimator(referenceView: self.view)
self.animator?.start()
}
}
SORDynamicAnimator.swift
class SORDynamicAnimator: NSObject {
let referenceView : UIView
private var items : [AnyObject] = []
private var animator : UIDynamicAnimator? //これをアニメーション中保持しておく必要あり!
init(referenceView : UIView) {
self.referenceView = referenceView
}
func start() {
if self.animator == nil {
let view : UIView = self.referenceView
var items : [AnyObject] = []
//レイアウトを強制的に更新
view.layoutIfNeeded()
//全てのsubViewを抽出
self.allSubviews(view)
//全てのsubViewからUILayoutSupportを省く
for item in self.items {
if item is UILayoutSupport {
continue
}
if item is UIDynamicItem {
items.append(item)
}
}
//アニメータ作成
let animator = UIDynamicAnimator(referenceView: view)
//重力設定
let gravityBeahvior = UIGravityBehavior(items: items)
animator.addBehavior(gravityBeahvior)
//衝突設定
let collisionBehavior = UICollisionBehavior(items: items)
collisionBehavior.translatesReferenceBoundsIntoBoundary = true
animator.addBehavior(collisionBehavior)
self.animator = animator
}
}
private func allSubviews(view : UIView) -> () {
for subview in view.subviews {
if subview is UIView {
self.items.append(subview)
self.allSubviews(subview as! UIView)
}
}
}
}
適当にラベルやらを並べてみる
表示と同時に、崩れ落ちていく、、、
なお、TableViewやらNavigationControllerやら使ってるとクラッシュしちゃいます・・。