iOS, Swiftでのアニメーションについて(2)

今回は、以下のUIViewのクラスメソッドを試してみました。 iOS4の頃からあるものの、僕は使ったことがありませんでした。

class func transitionWithView(_ view: UIView,
                     duration duration: NSTimeInterval,
                      options options: UIViewAnimationOptions,
                   animations animations: (() -> Void)?,
                   completion completion: ((Bool) -> Void)?)

公式ドキュメントに、

Creates a transition animation for the specified container view.

とあるように、「指定のコンテナビュー(UIView)の遷移・変化アニメーションを作る」とある。

optionsに指定できるアニメーションはなかなか豊富で以下の種類がある。

public static var TransitionNone: UIViewAnimationOptions { get } // default
public static var TransitionFlipFromLeft: UIViewAnimationOptions { get } // 左回転
public static var TransitionFlipFromRight: UIViewAnimationOptions { get } //右回転
public static var TransitionCurlUp: UIViewAnimationOptions { get }  //上にめくる
public static var TransitionCurlDown: UIViewAnimationOptions { get } // 下にめくる
public static var TransitionCrossDissolve: UIViewAnimationOptions { get }  //  クロスフェード
public static var TransitionFlipFromTop: UIViewAnimationOptions { get } // 上回転
public static var TransitionFlipFromBottom: UIViewAnimationOptions { get } // 下回転

最初は、animationsのブロックの中になにを書いたらいいのか分からなかったが、 アニメーションの過程で行われる、 ビューの追加、削除などを書く。 公式のドキュメントのサンプルにも下のように書かれている。

// toViewは、アニメーションの過程でContainerViewに追加されるUIVIew
// fromViewは、アニメーションの過程でContainerViewから削除されるUIView
[UIView transitionWithView:containerView
           duration:0.2
           options:UIViewAnimationOptionTransitionFlipFromLeft
           animations:^{ [fromView removeFromSuperview]; [containerView addSubview:toView]; }
           completion:NULL];

これを応用すると、以下の具合にUINavigationControllerの遷移アニメーションも変更することができる。 参考: [iOS] ナビゲーションコントローラのトランジションを手軽に差し替える方法 | Developers.IO

class MyNavigationController: UINavigationController {

    override func pushViewController(viewController: UIViewController, animated: Bool) {
        if animated {
            UIView.transitionWithView(self.view, duration: 0.4, options: .TransitionCurlDown, animations: { 
    // viewの追加処理
              super.pushViewController(viewController, animated: false) 
            }, completion: nil)
        }
        else {
            super.pushViewController(viewController, animated: false)
        }
    }
}

このように書くとUINavigationControllerでpushViewController関数を使った時に、 指定のUIViewAnimationOptionsでアニメーションさせることができる。