UIKit DynamicsでViewを落下させる!(息抜き)


ええい!ってなったときに、
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やら使ってるとクラッシュしちゃいます・・。