含まれている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。