UIModalPresentationCustom
プレゼンテーション スタイルを使用して表示されたビュー コントローラーがあります。カスタムを使用してUIViewControllerTransitioningDelegate
、View Controller をサイドバーとして表示します (画面の端からスライドし、全画面を占有しないようにします)。
ただし、このビュー コントローラーから別のビュー コントローラーを表示し、全画面表示のビュー コントローラーを閉じるUIModalPresentationFullScreen
と、基になるカスタム表示コントローラーのサイズが突然変更され、全画面を占有します。なぜこれが事実なのか誰にも分かりますか?
編集: これは基本的にanimateTransition
、サイドバーを表示するための私の方法です — 読みやすいようにほとんどのコードを削除しました。基本的に、transitionContext からコンテナーを取得し、宛先ビュー コントローラーのビューをコンテナーに追加してアニメーション化します。
- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext
{
UIView *container = transitionContext.containerView;
UIViewController *fromVC = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
UIViewController *toVC = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
UIView *fromView = fromVC.view;
UIView *toView = toVC.view;
if( toVC.isBeingPresented )
{
[container addSubview:toView];
//... Animate some new frame for toView
//Call [transitionContext completeTransition:YES] on animation completion
}
else
{
//... Animate fromView out
//On completion remove fromView from superview
//Call [transitionContext completeTransition:YES] on animation completion
}
}
編集 2: もう少し調査を行うと、モーダル スタックでその上にあるビュー コントローラーが閉じられたときに、カスタム表示されたビュー コントローラーのビューのフレームが設定されていることに気付きました。次のスタック トレースでは、フレームが全画面表示に設定されています。
0 -[MyCustomPresentedViewControllerView setFrame:]
1 -[UIView(MPAdditions) setFrameOrigin:]
2 -[UIViewControllerAccessibility(SafeCategory) dismissViewControllerWithTransition:completion:]
3 -[UIViewController dismissViewControllerAnimated:completion:]