transitionFromView:toView:... を使用すると、新しいビューを共通のコンテナに追加する必要がなくなります。これは、transition メソッドがビューの追加を処理するためです。以下は私のために働いた。コードは、ビューが「ビューから」であるView Controllerにあります。ここではクロス フェードを使用していますが、他の利用可能な方法のいずれかに変更できます。
-(void)switchViews:(id)sender {
UIWindow *win = self.view.window;
YellowController *yellow = [self.storyboard instantiateViewControllerWithIdentifier:@"Yellow"];
yellow.view.frame = self.view.frame;
[UIView transitionFromView:self.view toView:yellow.view duration:2 options:UIViewAnimationOptionTransitionCrossDissolve completion:^(BOOL finished) {
win.rootViewController = yellow;
}];
}
ただし、カスタムトランジションを行うには、「ビューから」が含まれているビューのサブビューとして新しいビューを追加する必要があります(私は思います)。この例では、それがウィンドウのビューです。このコードは、古いビューの中心から新しいビューを拡大しますが、そのビューはフェードアウトします。遷移の最後に、View Controller は新しいビューを所有するもの (この場合は黄色) に切り替えられます。
編集後: CGAffineTransform を使用するようにこのメソッドを変更しました (私の質問への回答で提案された jrturton に感謝します):
-(void)switchViews3:(id)sender {
UIWindow *win = self.view.window;
YellowController *yellow = [self.storyboard instantiateViewControllerWithIdentifier:@"Yellow"];
yellow.view.frame = self.view.frame;
yellow.view.transform = CGAffineTransformMakeScale(.1, .1);
[win addSubview:yellow.view];
[UIView animateWithDuration:.6 animations:^{
yellow.view.transform = CGAffineTransformIdentity;
self.view.alpha = 0;
}
completion:^(BOOL finished) {
[self.view removeFromSuperview];
win.rootViewController = yellow;
}];
}