10

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:]
4

3 に答える 3

3

同じ問題が発生しています。シンボリックブレークポイントを使用してデバッグしようとしましたが、これを行う何らかのレイアウトマネージャーに内部呼び出しがあるようです。

これを「解決」することはできませんでしたが (SDK のバグのように思えます)、これを修正する回避策を見つけることができました。基本的に、提示されたビューの正しいサイズを 2 つの適切なタイミングで設定する必要があります。このような:

カスタム UIPresentationController を使用して提示されたビュー コントローラーで、これを追加します。

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    dispatch_async(dispatch_get_main_queue(), ^{
        self.view.frame = [self.presentationController frameOfPresentedViewInContainerView];
    });
}

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    self.view.frame = [self.presentationController frameOfPresentedViewInContainerView];
}

そして、あなたが疑問に思っているなら: はい、2 か所で行う必要があります。奇妙なことに、viewDidAppear 非同期ブロックでのみ実行すると、アニメーションが終了すると壊れてしまいました (フルスクリーンにサイズ変更されました)。

于 2015-11-19T23:46:53.527 に答える
2

使用してみてください:

viewController.modalPresentationStyle = UIModalPresentationOverCurrentContext;

それはiOS 8.1で私を助けました

于 2014-11-20T20:59:32.293 に答える