web-dev-qa-db-ja.com

UIPopoverControllerは、pushViewControllerの最大高さに自動的にサイズ変更されます

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

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

次に、新しいView Controllerをプッシュします。

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

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

Xibのすべてのビューの高さを、柔軟ではなく固定の高さに設定しようとしました。ポップオーバーの高さを明示的に設定しようとしました。また、別のView Controllerを子ビューとして使用してみました。問題は残ります:ポップオーバーwantsは、新しいビューがNavigation Controllerにプッシュされるたびに、自動的に最大の高さにサイズを変更します。

question は、新しいビューをプッシュするときにポップオーバーのサイズを意図的に制御しようとすることを説明しています。

これは、サイズを制御するためのブルートフォースメソッドであると考えました。ただし、奇妙なことに、実際にはいくつかのクイックグラフィックスが発生し(ビューが新たにアニメーション化されているように)、その後、上記のようにサイズ変更を続けます。

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

ナビゲーションコントローラーですか?誰もこのようなことを見ましたか?

68
SG1

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

[〜#〜] edit [〜#〜]contentSizeForViewInPopoveriOS7.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をタップしたときにサイズ変更が行われないようにします。

123
borked

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

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

IOS5の場合

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

- (void)viewDidLoad {
    [super viewDidLoad];

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

}
30
MUH Mobile Inc.

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

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

戻るボタンが選択されたとき、ポップオーバーは私が望んでいた特定のサイズではなく、デフォルトのサイズ(私は信じている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プロパティを追加することにより、特定のサイズを強制します。

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

クルト

11
Kurt

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

- (void)viewDidLoad
{
    [super viewDidLoad];

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

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

9
Abdullah Umer

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

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

View Controllerのプッシュ:

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

ツールバーを表示する:

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

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

6
Paul Solt

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

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

動作するIOS 5.1

5
MrJre

Borkedのアドバイスに若干の違いがあります(そのおかげで正しい方向を示してくれました!)、新しいコントローラーをプッシュしてサイズを維持してからプッシュするときに、次のようにします。

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

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

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

self.contentSizeForViewInPopover行は、ユーザーがbackを押したときにサイズを保持します。この行は、viewWillAppearなど、どこでも好きな場所に置くことができます。

動作しているようです...

4
William Denniss

ナビゲーションで使用しているすべてのView Controllerの-(void)viewDidLoadで、コードを記述します。

self setContentSizeForViewInPopover:CGSizeMake(320, 500)];
2
SumiSadiq

ストーリーボードでcontentSizeForViewInPopoverを設定するには2つの方法があります。 Navigation Controllerに付属しているView ControllerをFreeFormに設定し、ルートビューを目的のサイズに設定できます。または、シミュレートされたメトリックを推測どおりに保持し、[明示的なサイズを使用]をオンにして、そこに必要なサイズを設定できます。

次に、Navigation Controller内にある各View Controllerで、次を追加します...

- (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で他のサイズを指定したりする必要はありません。すべてストーリーボードにあります。

View Controllerの1つに可変高がある場合、そのビューでcontentSizeForViewInPopoverをオーバーライドする必要があります...

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

このようなものは一度機能したかもしれませんが、contentSizeForViewInPopoverが非推奨になっているxCode 6では機能しません。幸いなことに、ストーリーボードの読み込み時に尊重されます。 xmlエディター(Xmplify)をダウンロードし、ストーリーボードをハッキングしました。キーcontentSizeForViewInPopoverを希望のサイズに設定します。ストーリーボードを保存して置き換えます(最初にコピーを作成します)。

すなわち :

< viewController>

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

</viewController>
1
Joe313

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

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

ポップオーバーが表示されたら、vc1のボタンを押し、vc2をNavigation Controllerにプッシュします

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

ポップオーバーが自身のサイズを変更するのを見ることができますが、vc1サイズは古いです... WHAT IS THIS ???

OK、今すぐ作業...コントローラーにポップオーバープロパティを追加

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

Swift 4とiOS 11を実行する唯一の解決策は私のためでした。showViewController:sender: and showDetailViewController:sender: の代わりに presentViewController:animated:completion:

Apple Doc

ShowViewController:sender:およびshowDetailViewController:sender:メソッドは、View Controllerを表示するための最も適応性のある柔軟な方法を提供します。これらの方法により、プレゼンテーションを行うView Controllerは、プレゼンテーションの最適な処理方法を決定できます。たとえば、コンテナView Controllerは、View Controllerをモーダルで表示する代わりに、子として組み込む場合があります。デフォルトの動作では、View Controllerがモーダルモードで表示されます。

0
BilalReffas