uipopoverController PushViewControllerの最大高さに自動的にサイズを変更します

StackOverflow https://stackoverflow.com/questions/3458722

質問

UinavigationControllerを含むポップオーバーがあります。ポップオーバーを順調に表示できます。NAVControllerが正常に含まれています。 NavControllerにはTableViewが含まれており、アイテムを選択すると、新しい詳細ビューが作成されます。

     DeviceDetailViewController *detailViewController = 
[[[DeviceDetailViewController alloc] initWithNibName:@"DeviceDetailViewController" bundle:nil] autorelease];

次に、新しいビューコントローラーを押します:

    [self.navigationController pushViewController:detailViewController animated:YES];

これは問題が発生するときです: 新しいビューを押すと、ポップオーバーはiPadで利用可能な最大高さにサイズを変更します。

Xibのすべてのビューの高さを、柔軟ではなく固定された高さに設定しようとしました。ポップオーバーの高さを明示的に設定しようとしました。また、さまざまなビューコントローラーを子ビューとして使用してみました。問題は残っています:ポップオーバー 欲求 新しいビューがナビゲーションコントローラーにプッシュされるたびに、自動的に最大高さにサイズを変更します。

これが次のとおりです 質問 これは、新しいビューをプッシュするときに、ポップオーバーのサイズを意図的に制御しようとすることについて議論しています。

これはサイズを制御するためのブルートフォースの方法であると思いました。しかし、奇妙なことに、実際には、上記のように、実際にいくつかのクイックグラフィックスの癖を引き起こします(まるでビューが新鮮にアニメーション化されているかのように)続きます。

言い換えれば、何かが文字通りポップオーバーをその最大高さに強制しており、それは起こるようです すべての委任方法が呼び出されています。

ナビゲーションコントローラーですか?誰かがこの種のことを見たことがありますか?

役に立ちましたか?

解決

これは、私が同じ問題を抱えた後、私のためにそれを修正しました(偶然にも今日も):

編集 : として contentSizeForViewInPopover で非難されています iOS7.0 だから使用してください preferredContentSize.

以下の元の答え:

あなたの中で detailViewController これを追加:

- (void)viewWillAppear:(BOOL)animated {

    CGSize size = CGSizeMake(320, 480); // size of view in popover
    self.contentSizeForViewInPopover = size;

    [super viewWillAppear:animated];

}

また、元のDevicedEtailViewControllerに似たものを追加して、バックNavbaritemをタップするときにサイズ変更を防ぎます。

他のヒント

それを処理するのと同じように viewWillAppear, 、これに対処する別の方法はオーバーライドすることです contentSizeForViewInPopover. 。非常に簡潔:

-(CGSize)contentSizeForViewInPopover
{
    return self.view.bounds.size;
}

iOS5の場合

私はあなたがそれをすることをお勧めします:

- (void)viewDidLoad {
    [super viewDidLoad];

    CGSize size = CGSizeMake(320, 480); // size of view in popover
    self.contentSizeForViewInPopover = size;

}

同様の問題がありました。

ツールバーのボタンからポップオーバーがありました。ポップオーバーは特定のサイズに設定されていました。テーブルビューでした。テーブルの行が選択されたとき、ナビゲーションコントローラーを備えた新しいビューコントローラーが呼び出されました。

バックボタンが選択されたとき、私が望んだ特定のサイズではなく、ポップオーバーがデフォルトサイズ(320x1100と思う)になりました。

元のコードは次のとおりです。

  MyTableViewController *myVC = [[MyTableViewController alloc] init];
  UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:myVC];

  UIPopoverController *popover = [[UIPopoverController alloc] initWithContentViewController:navController];
  popover.delegate = self;

  popover.popoverContentSize = CGSizeMake(400.0, 500.0);

  [myVC release];
  [navController release];
  [popover release];

問題を解決するために1行を追加しました。私はヘッダーの高さを差し引かなければならなかったので、それは一種の回避策のようなものです。たぶん、あなたの一人が私をより良い方法で啓発することができました。とにかく、それは機能します。

  MyTableViewController *myVC = [[MyTableViewController alloc] init];

  UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:myVC];

  UIPopoverController *popover = [[UIPopoverController alloc] initWithContentViewController:navController];
  popover.delegate = self;

  popover.popoverContentSize = CGSizeMake(400.0, 500.0);

  //Subtract the height of the header to match the total popover size (not just the view).
  myVC.contentSizeForViewInPopover = CGSizeMake(400.0, 500-44);

  [myVC release];
  [navController release];
  [popover release];

NAVコントローラーが関与し、バックボタンが押されていると、ポップオーバーがデフォルトのデフォルトサイズになると思います。 View ControllerMyVCにContentSizeForViewInPopoverプロパティを追加することにより、特定のサイズを強制します。

これが役立つことを願っています。

カート

iOS 7の場合、次のものを使用します。

- (void)viewDidLoad
{
    [super viewDidLoad];

    CGSize size = CGSizeMake(320, 768); // size of view in popover
    self.preferredContentSize = size;
}

UIViewController.contentSizeForViewInPopover iOS 7で最初に廃止されました。

アニメーションのグラフィカルなグリッチに応じて:

UIPOPOVERCONTROLLERアニメーションは、UinAvigationControllerを使用してPopoverを作成する場合、Uinavigation Controllers Animationsと競合します。その結果、アニメーション化するときにグラフィカルな不具合が生じます。問題を修正するには、他のコントローラーをプッシュするとき、またはツールバーを表示するときにアニメーションパラメーターをfalseに設定します。

ビューコントローラーを押す:

[self.navigationController pushViewController:detailViewController animated:NO];

ツールバーを見えるようにする:

[[self navigationController] setToolbarHidden:NO animated:NO]; 

アニメーションの設定:noは、uipopovercontrollerでアニメーションを正しく見せます。

なぜ設定しないのですか contentSizeForViewInPopover 次のコントローラーをナビゲーションスタックに押し込む前に?サイズを設定する必要はありません viewWillAppear など。

[nextController setContentSizeForViewInPopover:[self contentSizeForViewInPopover]];
[[self navigationController] pushViewController:nextController animated:YES];

iOS 5.1で動作します

Borkedのアドバイスのわずかなバリエーション(これは私に正しい方向に向けられました、ありがとう!)、それを押す前にサイズを維持するために新しいコントローラーを押すときに私がすることは次のとおりです。

productViewController.contentSizeForViewInPopover = self.view.bounds.size;
self.contentSizeForViewInPopover = self.view.bounds.size;

[self.navigationController pushViewController:productViewController animated:YES];

私はこれが好きです。なぜなら、私はすべてのビューコントローラーのポップオーバー値をハードコードする必要がないからです(さまざまな高さで使用するので良いからです)。

self.contentSizeForViewInPopover ラインは、ユーザーがヒットしたときにサイズを保持することです 戻る. 。このラインをどこかに置くことができると思います。 viewWillAppear またはあなたが好きな場所。

働いているようです...

ナビゲーションで使用しているすべてのビューコントローラーの - (void)viewdidloadでコードを書き込みます。

self setContentSizeForViewInPopover:CGSizeMake(320, 500)];

ストーリーボードにContentsizeForViewinPopoverを設定するには、2つの方法があります。ナビゲーションコントローラーにあるビューコントローラーを設定して、フリーフォームにルートビューを目的のサイズに設定できます。または、シミュレートされたメトリックを推測したままにして、「明示的なサイズを使用」を確認し、そこに必要なサイズを設定することができます。

次に、ナビゲーションコントローラー内にある各ビューコントローラーに、以下を追加してください...

- (void)viewDidAppear:(BOOL)animated {
     [super viewDidAppear:animated];

     ["yourpopoverController" setPopoverContentSize:CGSizeMake(self.
           contentSizeForViewInPopover.width, seld.contentSizeForViewInPopover.height + self.
           navigationController.navigationBar.frame.size.height) animated:YES];
}

トランジションアニメーションでは、新しいビューが上部に整合し、それに応じて高さが調整されます。

このようにして、コンテンツをオーバーライドする必要はありません。それはすべてストーリーボードにあります。

ビューコントローラーの1つの高さがさまざまな場合、そのビューのようにそのビューでコンテンツをオーバーライドする必要があります...

- (CGSize)contentSizeForViewInPopover {
    return CGSizeMake(450, "calculate your height here");
}

このようなものは一度機能したかもしれませんが、Xcode 6ではそうではありませんでした。幸いなことに、ストーリーボードの読み込み時に尊敬されています。 XMLエディター(Xmplify)をダウンロードし、ストーリーボードをハッキングしました。重要なコンテンツを設定してください。保存して交換(最初にコピーを作成します)ストーリーボード。

すなわち :

< viewController>

     <value key="contentSizeForViewInPopover" type="size" width="450" height="280" / >

</viewController>

私がこれを使用するとき、私のために働かないでください:

[UIPopoverController 
    [UINavigationController] = root vc = [UIViewController vc1] => [UIViewController vc2] 
]

表示されている場合は、ポップオーバーがすべて優れている場合は、VC1のボタンを押し、VC2をナビゲーションコントローラーに押します

次に、VC2(poptorootviewControllerメソッド)のVC1(root)押しボタンに戻ります。

ポップオーバーが独自のサイズが変更されることがわかりますが、VC1サイズは古いです...これは何ですか?

さて、今作業...私のコントローラーにポップオーバープロパティを追加します

self.contentSizeForViewInPopover = (CGSize){400, 200};
self.navigationController.contentSizeForViewInPopover = self.contentSizeForViewInPopover;
self.popover.popoverContentSize = self.contentSizeForViewInPopover;

Swift 4とiOS 11を実行している唯一の可能な解決策は、私にとってでした。使用する showViewController:sender: and showDetailViewController:sender: それ以外の presentViewController:animated:completion:.

Apple Docから

The ShowViewController:Sender:and ShowDetailViewController:Sender:Methodは、ビューコントローラーを表示するための最も適応的で柔軟な方法を提供します。これらの方法により、表示ビューコントローラーは、プレゼンテーションを処理する最善の方法を決定できます。たとえば、コンテナビューコントローラーには、視野コントローラーがモダンに提示する代わりに子供として組み込まれる場合があります。デフォルトの動作は、ビューコントローラーをモダンに提示します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top