UIViewControllerContextTransitioning
UIViewControllerTransitioning.hのヘッダーに書いてあったUIViewControllerContextTransitioningのコメントの意訳をしてみます。
@protocol UIViewControllerContextTransitioning <NSObject> @property(nonatomic, readonly) UIView *containerView; @property(nonatomic, readonly, getter=isAnimated) BOOL animated; @property(nonatomic, readonly, getter=isInteractive) BOOL interactive; @property(nonatomic, readonly) BOOL transitionWasCancelled; @property(nonatomic, readonly) UIModalPresentationStyle presentationStyle; - (void)updateInteractiveTransition:(CGFloat)percentComplete; - (void)finishInteractiveTransition; - (void)cancelInteractiveTransition; - (void)pauseInteractiveTransition NS_AVAILABLE_IOS(10_0); - (void)completeTransition:(BOOL)didComplete; - (nullable __kindof UIViewController *)viewControllerForKey:(UITransitionContextViewControllerKey)key; - (nullable __kindof UIView *)viewForKey:(UITransitionContextViewKey)key NS_AVAILABLE_IOS(8_0); @property(nonatomic, readonly) CGAffineTransform targetTransform NS_AVAILABLE_IOS(8_0); - (CGRect)initialFrameForViewController:(UIViewController *)vc; - (CGRect)finalFrameForViewController:(UIViewController *)vc; - @end
1. 遷移コンテキスト
1.1遷移コンテキストとは
遷移コンテキストはシステムによって作成され、animateTransition:とtransitionDuration:内の「animator」に渡されるのと同様にstartInteractiveTransition:における「Interaction controller」にも渡される。
1.1.1 「Interaction controller」がある場合
「Interaction controller」がある場合は、最初にstartInteractiveTransition:が呼び出され、必要に応じて「Interaction controller」のanimateTransition:を呼び出す。
1.1.2 「Interaction controller」がない場合
「Interaction controller」がない場合、システムは自動的に「Animator」のanimateTransition:を呼び出す。
システムは、ビューコントローラのtransitioningDelegateまたは
ナビゲーションコントローラのdelegateに「Animator」もしくは「Interaction controller」が遷移において使われるべきかを問い合わせる。
1.2 transitioningDelegate
transitioningDelegateはUIViewControllerの新しいプロパティであり、UIViewControllerTransitioningDelegateプロトコル(以下で述べる)に準拠している。
それはNavigation controllerが新しいdelegateメソッドと対になって議論されてきたのと同様である。
2 UIViewControllerContextTransitioningプロトコル
2.1
UIViewControllerContextTransitioningプロトコルはカスタムコンテナコントローラによって採用できる。システムが現在サポートしているより複雑な遷移をカバーするように意図的に一般的になっている。
2.1.1 現状カスタマイズできるものはpushとpresent
今のところナビゲーションのpush/popとUIViewControlelrのpresent/dismiss遷移をカスタマイズできる。
2.2 遷移についての情報
遷移についての情報はviewControllerForKey:、initialFrameForViewController:、そしてfinalFrameForViewController:を用いることでえられる。
2.2.1 2つのキー
システムはナビゲーションのpush/popとUIViewControlelrのpresent/dismiss遷移に対して、遷移先のViewControllerと遷移元のViewControllerがわかる2つのキーを提供する。
2.3 completeTransition:
すべてのカスタムアニメーションは遷移が完了したときに必ずコンテキストのcompleteTransition:を呼び出さなければならない。
2.3.1 アニメーションの制限
さらに、アニメーションはコンテキストによって指定されたcontainerViewで起きなければならない。
2.4 インタラクティブな遷移
インタラクティブな遷移に対してコンテキストのupdateInteractiveTransition:、finishInteractiveTransition: または cancelInteractiveTransition:はインタラクティブなアニメーションの進行に応じて呼ばれるべきである。
2.4.1 UIPercentDrivenInteractiveTransition
UIPercentDrivenInteractiveTransitionクラスはUIViewControllerInteractiveTransitioningの一つの実装を提供する。
それは 「Animator」によって生成されたUIViewのプロパティの任意のアニメーションをインタラクティブに操作することができる。