3

私は独自のカスタムUIViewControllerトランジションを実装しており、TO ビュー コントローラーのフレームをデバッガーに出力すると、{{0, 0}, {0, 0}}最初と最後のフレームの両方を受け取ります。コンテキストのメソッドは、最終的な遷移後の予想フレームと、遷移前の初期フレームを表示するはずだと思いました。

これはどのように機能するはずですか?

-(void)startInteractiveTransition:(id<UIViewControllerContextTransitioning>)transitionContext{

    UIViewController *fromVC = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
    UIViewController *toVC = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];

    CGRect initialToFrame = [transitionContext initialFrameForViewController:toVC];
    CGRect finalToFrame = [transitionContext finalFrameForViewController:toVC];
    NSLog(@"initialToFrame: %@, finalToFrame: %@", NSStringFromCGRect(initialToFrame), NSStringFromCGRect(finalToFrame));
}

デバッガーは以下を表示しています: initialToFrame: {{0, 0}, {0, 0}}, finalToFrame: {{0, 0}, {0, 0}}


さらに、デバッガーには次の警告も表示されます。これはとにかくエラーに寄与しますか?

Presenting view controllers on detached view controllers is discouraged

4

1 に答える 1

1

最初に知っておくべきことは、カスタム トランジションには大まかに 2 種類あることです。フルスクリーンと非フルスクリーンtoVC.vewです。非フルスクリーン トランジションで最終フレームを要求しても意味がありません。

modalPresentationStyle設定しないか、明示的に設定しない場合UIModalPresentationFullScreen(これがデフォルト値です)、UIKit はそれtoVC.viewが画面全体をカバーすることを認識しているため-finalFrameForViewController:toVC、正しいフレーム (メイン画面フレーム) を返します。

を使用modalPresentationStyle = UIModalPresentationCustomすることで、トランジションがフルスクリーンではないことを指定しています。それだけです:toVC.view部分的にカバーしますfromVC.view(したがってfromCV.view、階層に保持されます) 。will toVC.view coverfromVC.viewはあなたの決定です。-finalFrameForViewController:CGRectZero

それCGRectZeroがあなたに伝えているのは、「ねえ、放っておいて、好きな場所にそのビューを置いてください」ということです。

詳細については、このプレゼンテーションをご覧ください: http://es.slideshare.net/Split82/custom-uiviewcontroller-transitions

お役に立てれば。

于 2014-09-20T17:47:37.637 に答える