20

UIViewControllerカスタム トランジションとカスタム を使用して紹介していますUIPresentationController。ビュー コントローラーのビューは画面全体をカバーしていないため、表示中のビュー コントローラーは引き続き表示されます。

次に、UIImagePickerControllerこのビュー コントローラーの上に のインスタンスを表示します。問題は、イメージ ピッカーを閉じると、表示するビュー コントローラーのフレームが、カバーしたい部分だけではなく、画面全体をカバーすることです。frameOfPresentedViewInContainerView私のカスタムで指定されたフレームはUIPresentationController完全に無視されているようです。

modalPresentationStyleフレームの画像ピッカーが存在する場合にのみ、UIModalPresentationOverCurrentContextそのまま残ります(そもそもビュー階層からビューが削除されないため、これは理にかなっています)。残念ながら、それは私が望むものではありません。画像ピッカーを全画面表示にしたいのですが、何らかの理由でレイアウトが台無しになっているようです。ここで間違っていることや忘れていることはありますか? 助言がありますか?

4

5 に答える 5

4

これは、全画面表示では によって計算された元のフレームが復元されないためframeOfPresentedViewInContainerViewです。これを修正するための推奨される方法は、提示されたビュー コントローラーのビューを挿入するラッパー ビューを作成することです。カスタム プレゼンテーション コントローラに関連するコードは次のとおりです。

- (void)presentationTransitionWillBegin {
    // wrapper is a property defined in the custom presentation controller.
    self.wrapper = [UIView new];
    [self.wrapper addSubview:self.presentedViewController.view];
}

- (CGRect)frameOfPresentedViewInContainerView {
    CGRect result = self.containerView.frame;

    // In this example we are doing a half-modal presentation
    CGFloat height = result.size.height/2;
    result.origin.y = height;
    result.size.height = height;

    return result;
}

- (UIView *)presentedView {
    return self.wrapper;
}

- (BOOL)shouldPresentInFullscreen {
    return NO;
}

- (void)containerViewWillLayoutSubviews {
    self.wrapper.frame = self.containerView.frame;
    self.presentedViewController.view.frame = [self frameOfPresentedViewInContainerView];
}

presentedViewデフォルト値 (提示されたビュー コントローラーのビュー) ではなく、ラッパー ビューを返すようにオーバーライドしていることに注意してください。このように、2 番目のプレゼンテーションがラッパーのフレームを変更しても、表示されたビュー コントローラーのビューは変更されません。

于 2016-06-23T04:19:05.657 に答える
3

これは私にとってはうまくいきましたUIPresentationController

override func containerViewWillLayoutSubviews() {

     super.containerViewWillLayoutSubviews()
     presentedViewController.view.frame = frameOfPresentedViewInContainerView
}
于 2017-05-30T12:42:04.983 に答える