Rodhos Soft

備忘録を兼ねた技術的なメモです。Rofhos SoftではiOSアプリ開発を中心としてAndroid, Webサービス等の開発を承っております。まずはご相談下さい。

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のプロパティの任意のアニメーションをインタラクティブに操作することができる。