登場人物
- UIViewControllerAnimatedTransitioning (アニメーションコントローラ)
- UIViewControllerContextTransitioning (画面遷移コンテキスト)
- UIViewControllerTransitioningDelegate (画面遷移デリゲート)
実装
1.どのようなアニメーションを行うかを定義したクラスを作成
UIViewControllerAnimatedTransitioningを継承したクラス
@interface HYFadeAnimationController : NSObject <UIViewControllerAnimatedTransitioning>
@end
実装はheaderファイル通り
アニメーション時間を指定
- (NSTimeInterval)transitionDuration:(id <UIViewControllerContextTransitioning>)transitionContext;
実際のアニメーションを指定
- (void)animateTransition:(id <UIViewControllerContextTransitioning>)transitionContext
{
// 遷移元と遷移先のViewControllerを取得
UIViewController* fromVC = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
UIViewController* toVC = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
// 遷移先のViewを追加
UIView* containerView = [transitionContext containerView];
[containerView insertSubview:toVC.view belowSubview:fromVC.view];
// アニメーションを指定
[UIView animateWithDuration:[self transitionDuration:transitionContext]
animations:^{
fromVC.view.alpha = 0.0;
} completion:^(BOOL finished) {
[transitionContext completeTransition:YES];
fromVC.view.alpha = 1.0;
}];
}
2.遷移先のViewControllerのTransitioningDelegateにUIViewControllerTransitioningDelegateを指定
どの遷移で、どのアニメーションコントローラを利用するか指定する(今回は遷移元に実装)
@interface HYViewController () <UIViewControllerTransitioningDelegate>
@end
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([[segue identifier] isEqualToString:@"showModalView"]) {
[[segue destinationViewController] setTransitioningDelegate:self];
}
}
- (id <UIViewControllerAnimatedTransitioning>)animationControllerForDismissedController: (UIViewController *)dismissed
{
return [[HYFadeAnimationController alloc] init];
}
0 件のコメント:
コメントを投稿