2

ストーリーボードで自動レイアウトを使用しています。セル rect から popoverPresentationController を提示します。

NumberController * viewController = [self.storyboard instantiateViewControllerWithIdentifier:@"NumberController"];
UIPopoverPresentationController *pc = [viewController popoverPresentationController];
    pc.delegate = self;
    pc.permittedArrowDirections = UIPopoverArrowDirectionAny;
    pc.sourceView = tableView;
    pc.sourceRect = [tableView rectForRowAtIndexPath:indexPath];
    [self.navigationController presentViewController:viewController animated:animated completion:nil];

ポップオーバーは、縦向きモードの iPad で矢印を上に表示します。

iPad を回転させてランドスケープ モードにします。popoverPresentationController は同じ sourceView/sourceRect を保持し、適切にセルを指します。また、上矢印も保持します。

しかし、現在はビューの下部にあるため、ポップオーバーはより短い高さにサイズ変更されます。これは望ましくない動作です。

ポップオーバーが単に新しい位置に移動して矢印の方向を変更するだけの場合、サイズを変更する必要はまったくありません。これは望ましい動作です。

次のメソッドを使用すると変更できると思いましたが、sourceView rect が変更されないため呼び出されません。

- (void)popoverController:(UIPopoverController *)popoverController
willRepositionPopoverToRect:(inout CGRect *)rect
                   inView:(inout UIView **)view {

}

allowedArrowDirections をリセットしようとしました (preferredContentSize で、これが最も論理的な場所のように思われたため)。これは機能しません (ポップオーバーはまだサイズ変更されます):

- (CGSize) preferredContentSize {
    [super preferredContentSize];
    self.popoverPresentationController.permittedArrowDirections = UIPopoverArrowDirectionUnknown;
    return CGSizeMake(DEFAULT_POPOVER_WIDTH,DEFAULT_POPOVER_HEIGHT);
}

ポップオーバーのサイズを変更する代わりに、popoverPresentationController に強制的に矢印の方向を変更させ、ポップオーバーの位置を変更させる方法を見つけることができません。私はそれが不可能だと思い始めています - しかし、私はまだ何かが足りないという希望を持ち続けています.

編集: それまでの間、iPad でサイズを変更したくない場合、ポップオーバーはこのビューを表示する最良の方法ではないかもしれないと思いました。UIModalPresentationFormSheet プレゼンテーションで試してみます。しかし、私はまだこの質問に対する答えを見つけたいと思っています。

4

1 に答える 1

2

私はちょうど問題に遭遇しました

    - (void)popoverController:(UIPopoverController *)popoverController
    willRepositionPopoverToRect:(inout CGRect *)rect
               inView:(inout UIView **)view {

ビューコントローラーが切り離されていたため、呼び出されていませんでした。ビュー コントローラーが子ビュー コントローラーとして追加されていないビューがビュー階層にある可能性があります。

次のメソッドを使用すると変更できると思いましたが、sourceView rect が変更されないため呼び出されません

sourceView rect を変更する必要はなく、インターフェイスの向きだけを変更する必要があります。UIPopoverControllerDelegate のドキュメントから:

presentPopoverFromRect:inView:permittedArrowDirections:animated: メソッドを使用して提示されたポップオーバーの場合、インターフェースの向きが変わると、ポップオーバー コントローラはこのメソッドを呼び出します。

于 2015-04-15T18:56:40.853 に答える