1. ホーム
  2. ios

[解決済み] ナビゲーションコントローラーを組み込んだポップオーバーがバックナビのサイズを考慮しない問題

2023-04-19 01:40:46

質問

UINavigationControllerをホストするUIPopoverControllerがあり、そこには小さなビューコントローラの階層が含まれています。

ドキュメントに従って、各ビューコントローラのために、ビューのpopover-contextのサイズをこのように設定しました。

[self setContentSizeForViewInPopover:CGSizeMake(320, 500)];

(コントローラごとにサイズが異なります)

これは階層を進むにつれて期待通りに動作します。ポップオーバーは押されたコントローラに対応するために自動的にアニメーションでサイズを変更します。

しかし、ナビゲーション バーの戻るボタンでビュー スタックを "Back" するとき、ポップオーバーはサイズを変更せず、到達した最も深いビューと同じ大きさのままです。私は、ポップオーバーがビュースタックを通じてポップアップするときに設定されたサイズを尊重することを期待しています。

私は何かを見逃しているのでしょうか?

ありがとうございます。

どのように解決するのですか?

私は同じ問題で苦労していました。上記の解決策はどれもうまくいかなかったので、少し調査して、これがどのように機能するかを調べることにしました。

これが私が発見したものです。

  • を設定すると contentSizeForViewInPopover を設定した場合、ポップオーバー自身によって変更されることはありません - 別のコントローラに移動する間にポップオーバーのサイズが変更されても。
  • 別のコントローラに移動している間にポップオーバーのサイズが変更された場合、戻っている間、ポップオーバーのサイズは復元されません。
  • viewWillAppearでポップオーバーのサイズを変更すると、非常に奇妙なアニメーションが表示されます(ポップオーバーの中にpopControllerがあるとします) - お勧めしません。
  • 私の場合、コントローラ内でハードコードされたサイズを設定することは全くうまくいきません。私のコントローラは、時には大きく、時には小さくする必要があります。

このような苦痛に対する解決策は、以下のとおりです。

のサイズをリセットする必要があります。 currentSetSizeForPopover のサイズをリセットする必要があります。しかし、注意しなければならないのは、フィールド currentSetSizeForPopover で設定されたものと同じサイズを設定すると、ポップオーバーはサイズを変更しません。そのためには、まず偽のサイズ(前に設定されたものとは異なる)を設定し、次に正しいサイズを設定すればよいのです。この方法は、コントローラがナビゲーションコントローラ内にネストされている場合でも動作し、コントローラ間を移動すると、それに応じてポップオーバーのサイズが変更されます。

以下のヘルパーメソッドで UIViewController のカテゴリを簡単に作成することができ、サイズを設定するトリックを行うことができます。

- (void) forcePopoverSize {
    CGSize currentSetSizeForPopover = self.contentSizeForViewInPopover;
    CGSize fakeMomentarySize = CGSizeMake(currentSetSizeForPopover.width - 1.0f, currentSetSizeForPopover.height - 1.0f);
    self.contentSizeForViewInPopover = fakeMomentarySize;
    self.contentSizeForViewInPopover = currentSetSizeForPopover;
}

そして、単に -viewDidAppear で呼び出すだけです。