UIKit Dynamics로 View를 떨어뜨리세요! (숨 쉬기)

8321 단어 iOSUIKitSwiftUIView
그래! 되었을 때,
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라든지 사용하고 있으면 크래쉬 해 버립니다··.

좋은 웹페이지 즐겨찾기