含まれているUINavigationControllerが新しいコントローラーをプッシュするときにUIPopoverControllerにそのサイズをアニメーション化させるにはどうすればよいですか?
iPadアプリでUIPopover
から表示されています。UIBarButtonItem
これには、UINavigationViewController
ルートビューコントローラとして一種の設定ウィンドウがあるが含まれています。設定ウィンドウはUITableViewController
(スタイルがグループ化に設定された)のサブクラスであり、そのセルのいずれかをタップすると、のサブクラスでもあるnavコントローラー上のさまざまな「選択」ビューコントローラーがプッシュされUITableViewController
ます。
チューザービューごとに、で適切viewDidAppear
に設定しています。contentSizeForViewInPopover
self.contentSizeForViewInPopover = CGSizeMake(320, self.items.count * 44);
しかし、それは変化をアニメートしません。ナビゲーションアニメーションが終了すると、ポップオーバーは新しい高さにスナップします(幅は320から変更されません)。後方にナビゲートすると、サイズの変更がアニメートされます(この回答の手法で実現されます)が、前方にナビゲートすると、サイズの変更はアニメートされません。
ポップオーバーへの参照を取得して使用しようとしましsetPopoverContentSize:animated:
たが、機能しません。私は無駄に他の 質問を見てきました。
サイズ変更を常に適切にアニメーション化するにはどうすればよいですか?
更新:これを試すための簡単なテストプロジェクトを設定しました。これは、XcodeでセットアップされたiPad用のタブバーアプリケーションです。ビューコントローラの1つでナビゲーションバーにタブバーアイテムを追加しました。そのボタンが押されると、コントローラーは、ルートビューコントローラーとしてUITableViewController
と呼ばれる非常に単純なサブクラスを持つナビゲーションコントローラーを含むポップオーバーを表示します。TestContentViewController
そのviewDidLoad
サブクラスの中で、私はランダムにいくつかのアイテムを生成します。
self.numItems = arc4random() % 10 + 3;
これは私の行数です。セクション数は1です。cellForRowAtIndexPath
セルのラベルテキストを設定して返します。行が選択されると、同じクラスの別のインスタンスを生成し、それをスタックにプッシュします。
VCのプロパティで何もしなくてもcontentSizeForViewInPopover
、ポップオーバーは最大の高さになり、テーブルビューの行数に関係なくそこにとどまります。
viewDidAppearでサイズを設定すると、次のようになります。
-(void)viewDidAppear:(BOOL)animated
{
self.contentSizeForViewInPopover = CGSizeMake(320, self.numItems * 44);
[super viewDidAppear:animated];
{
- ポップオーバーが最初に表示されると、非常にすばやくフルハイトに点滅してから、設定した高さにスナップします。
- 新しいコントローラーがナビゲーションコントローラーにプッシュされると、アニメーションなしでその高さにスナップします。
- 戻るときに、ポップ先のVCが、ポップ元のVCよりも高い場合は、正しいサイズにアニメーション化されます。私がポップしているものが小さければ、それは何もしません。
私が同じことをするが、でviewWillAppear
:
- ポップオーバーが最初に表示されるとき、それはフルハイトです
- 最初に行をタップしてスタックに新しいコントローラーを追加すると、最低でも約400pxの高さにアニメーション化されます。新しいコントローラーがスタックにプッシュされたときに、より高い高さが必要な場合は、それを取得します。そうでなければ、それは以前の状態にとどまります。
で同じことをすると、最初は正しいサイズで表示されることviewDidLoad
を除いて、基本的に同じです。viewWillAppear
navコントローラーのデリゲートをポップオーバーを表示するVCに設定してから、ポップオーバーの高さ(setPopoverContentSize:animated:
)をに設定しようとしましnavigationController:didShowViewController:animated:
たが、結果の高さは少しずれています。そこに設定したサイズは、ポップオーバーの上部に組み込まれているナビゲーションバーの余分な高さを考慮する必要があると思います。そして、スタックに新しいコントローラーをプッシュするときのアニメーションは奇妙です。
再度更新する:新しいで解決された同じ問題については、ここを参照してくださいUIPopoverPresentationController
。