69

UINavigationController を含むポップオーバーがあります。ポップオーバーを正常に表示でき、navController も正常に含まれています。navController には tableView が含まれており、項目を選択すると新しい詳細ビューが作成されます。

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

次に、新しいビュー コントローラーをプッシュします。

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

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

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

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

これは、サイズを制御するための強引な方法かもしれないと思いました。奇妙なことに、実際には、(ビューが新たにアニメーション化されているかのように) いくつかの素早いグラフィックスの異常が発生し、その後、上記のようにサイズ変更が続けられます。

つまり、何かが文字通りポップオーバーを最大の高さに強制しており、すべてのデリゲート メソッドが呼び出された後に発生しているように見えます。

ナビコントローラーですか?誰もこのようなものを見たことがありますか?

4

13 に答える 13

123

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

編集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をタップしたときにサイズが変更されないようにします。

于 2010-08-11T16:04:05.193 に答える
30

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

-(CGSize)contentSizeForViewInPopover
{
    return self.view.bounds.size;
}
于 2011-08-04T15:54:06.200 に答える
30

IOS5 の場合

次の場所で行うことをお勧めします。

- (void)viewDidLoad {
    [super viewDidLoad];

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

}
于 2011-10-14T19:42:16.720 に答える
11

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

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

戻るボタンを選択すると、ポップオーバーは、私が望む特定のサイズではなく、デフォルトのサイズ(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コントローラーが関係していて、戻るボタンが押されると、ポップオーバーがデフォルトのデフォルトサイズになると思います。ビューコントローラmyVCのcontentSizeForViewInPopoverプロパティを追加することにより、特定のサイズを強制します。

これがお役に立てば幸いです。

カート

于 2011-02-09T04:19:19.017 に答える
9

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

- (void)viewDidLoad
{
    [super viewDidLoad];

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

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

于 2014-02-12T15:39:14.670 に答える
6

アニメーションによるグラフィカルな不具合への対応:

内部に UINavigationController を含むポップオーバーを作成すると、UIPopoverController アニメーションが UINavigation コントローラ アニメーションと競合します。アニメーション化すると、グラフィックの不具合が発生します。この問題を解決するには、他のコントローラーを押すとき、またはツールバーを表示するときに、animated パラメーターを false に設定します。

View Controller のプッシュ:

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

ツールバーを表示する:

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

animation:NO を設定すると、UIPopoverController でアニメーションが正しく表示されます。

于 2010-10-19T17:50:00.943 に答える
5

contentSizeForViewInPopover次のコントローラーをナビゲーションスタックにプッシュする前に、単に設定してみませんか?サイズviewWillAppearなどを設定する必要はありません。

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

IOS5.1で動作します

于 2012-06-14T10:33:26.573 に答える
4

borkedのアドバイスに少し変化があります(それは私を正しい方向に向けました、それをありがとう!)、それを押す前にサイズを維持するために新しいコントローラーを押すとき私がすることは次のとおりです:

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

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

すべてのViewControllerでポップオーバー値をハードコーディングする必要がないのでこれが好きです(さまざまな高さで使用するので良いです)。

このself.contentSizeForViewInPopover行は、ユーザーがヒットバックしたときにサイズを保持するためのものです。私はあなたがこの線をどこか別の場所、好きな場所、好きな場所に置くことができると思いますviewWillAppear

動作するようです...

于 2010-11-12T07:20:05.897 に答える
2

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

次に、ナビゲーション コントローラー内にある各ビュー コントローラーで、次を追加します...

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

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

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

この方法では、contentSizeForViewInPopover をオーバーライドしたり、View Controller で特に他のサイズを指定したりする必要はありません。それはすべてストーリーボードにあります。

ビュー コントローラーのいずれかの高さが可変の場合、そのビューで contentSizeForViewInPopover を次のようにオーバーライドする必要があります...

- (CGSize)contentSizeForViewInPopover {
    return CGSizeMake(450, "calculate your height here");
}
于 2013-05-15T14:45:00.787 に答える
1

この機能は一度は機能した可能性がありますが、contentSizeForViewInPopover が廃止された xCode 6 では機能しませんでした。幸いなことに、ストーリーボードのロード時に尊重されます。xml エディター (Xmplify) をダウンロードして、ストーリーボードをハックしました。キー contentSizeForViewInPopover を必要なサイズに設定します。ストーリーボードを保存して置き換えます (最初にコピーを作成します)。

すなわち :

< viewController>

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

</viewController>
于 2014-12-16T15:31:28.840 に答える
0

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

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

ポップオーバーが正常に表示されたら、vc1 のボタンを押し、vc2 をナビゲーション コントローラーにプッシュします。

次に、vc2 (popToRootViewController メソッド) でボタンを押して vc1 (ルート) に戻ります。

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

わかりました、今はうまくいきます...コントローラーにポップオーバープロパティを追加します

self.contentSizeForViewInPopover = (CGSize){400, 200};
self.navigationController.contentSizeForViewInPopover = self.contentSizeForViewInPopover;
self.popover.popoverContentSize = self.contentSizeForViewInPopover;
于 2012-12-01T08:53:57.987 に答える