2011-12-15 16 views
26

UIViewControllerにはUITableViewが含まれています。 UIViewControllerUIPopoverControllerに表示されています。UIPopoverControllerのcontentSizeを動的に変更する方法はありますか?

さて、物事は(つまり - popoverContentSizetableView内の項目数が一定でない、と私はポップオーバーのサイズが欲しいということですtableView

内の項目数に応じて調整し、

私は、tableViewにすべてのアイテムをロードした後にcontentSizeForViewInPopoverviewDidLoadに設定すると、それは実現すると思っていました。

これはありませんでした。

私はそれを短くしています。popoverContentSizecontentViewControllerから直接変更するにはどうすればよいですか?

付録: enter image description here

答えて

46

iOS 7ユーザーのためのヘルプ。

+8

ビューが表示される前にViewWillAppearがうまく動作する可能性があります。 – nh32rg

+1

popover内でnavigationControllerを使用していて、preferredContentSizeを設定しても問題が発生している場合。試してみてください[self.parentPopOverController setPopoverContentSize:CGSizeMake(250,400)animated:YES]; UIViewControllerをプッシュする前に – Hassy

+1

最新のため、回答を受け入れました。ありがとう! –

9

さて、最後に、私は、私はそれを行うには正しいことだかはわからない何かをしたが、それが働いています。

私はpopoverControllerに私のcontentViewController内の参照を追加しました:

@property (nonatomic , assign) UIPopoverController *popoverControllerContainer; 

その後、私はviewWillAppearとviewDidAppearにサイズ変更コードを追加しました:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    [self.tableView reloadData]; 
} 

-(void) viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 
    self.contentSizeForViewInPopover = self.tableView.contentSize; 
} 

-(void) viewDidAppear:(BOOL)animated 
{ 
    [super viewDidAppear:animated]; 
    [self.popoverControllerContainer setPopoverContentSize:self.contentSizeForViewInPopover animated:YES]; 
} 

をので、ポップオーバーへの参照をさ維持ハックのようなものなので、私はより良いアイデアを聞くために開いています。

+0

を行う必要があります同じメカニズム。 popoverの内容として使用されるUIViewControllerにメソッド 'createPopover'を追加しています。これらのメソッドは、 'self'からポップオーバーを作成し、さらにアクセスするためにpopoverインスタンスを保存します。 – Sulthan

+0

こんにちは@Avrahamあなたの答えは私が使ったものでした。私はあなたの解決策について質問します:なぜあなたは、表示されるメソッドのビューのコンテンツサイズを設定し、そのポップオーバーサイズが表示されましたか?なぜ私は試してもうまくいかなかったので、2つの方法のうちの1つではできないのですか? –

+0

両方のコードをお互いに使用しても動作します:) –

7

UIViewControllerクラスは、プロパティへの参照を追加する必要が出/ W上にポップのサイズを変更します

self.contentSizeForViewInPopover 

を有しています。

そして、ソリューションを拡張するために、私はrectForSection:メソッドを使ってセクションのサイズを取得しました(私は1セクションしか持たないので、取得するのは簡単です)。そして、ナビゲーションバーの高さを追加しました。 20)。私はポップオーバーに仕上がったテーブルビューのサイズを作成することができるよ:

CGRect sectionRect = [view.tableView rectForSection:0]; 

if (sectionRect.size.height + 20 < POPOVER_SIZE.height) 
    view.contentSizeForViewInPopover = CGSizeMake(POPOVER_SIZE.width, sectionRect.size.height + 20); 
else 
    view.contentSizeForViewInPopover = POPOVER_SIZE; 

は、複数のセクションで、より難しいかもかもしれませんが、私はそれをしようとしませんでした。セクションの高さを合計することができるはずですが、わからない間隔の問題があるかもしれません。

私は私はあなたの UIPopOverViewConotroller

-(void) viewDidAppear:(BOOL)animated{ 
    [super viewDidAppear:animated]; 
    self.preferredContentSize=myTableView.contentSize; 
} 

希望の電子contentViewController、あなたののUIViewControllerに次の行を使用してくださいiOSの7 からこの意志は非常に答えるの後半が、新しいユーザーのためにあるかもしれない

+2

推奨されていません.iOS7以降の「preferredContentSize」を使用してください。 – Satyam

0

私はこの同じ問題を抱えていました。私は一緒に私がうまく動作すると思うと私は石畳。

私の値を保持する配列を私のinitWithCoderに持っています。私はこのコードを実行するだけです:

- (id)initWithCoder:(NSCoder *)aDecoder 
{ 
//Popover Choices 

_importantChoices = [NSMutableArray array]; 
[_importantChoices addObject:@"Bakery"]; 
[_importantChoices addObject:@"Beverage Dry Mix"]; 
[_importantChoices addObject:@"Beverage RTD"]; 
[_importantChoices addObject:@"Crisps"]; 
[_importantChoices addObject:@"Meat"]; 
[_importantChoices addObject:@"Supplements"]; 


//Calculate size of Popover 
self.clearsSelectionOnViewWillAppear = NO; 
NSInteger rowsCount = [_importantChoices count]; 
NSInteger singleRowHeight = [self.tableView.delegate tableView:self.tableView 
             heightForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]]; 
NSInteger totalRowsHeight = rowsCount * singleRowHeight; 
CGFloat largestLabelWidth = 0; 
for (NSString *tmp in _importantChoices) { 
    CGSize labelSize = [tmp sizeWithAttributes:@{NSFontAttributeName:[UIFont systemFontOfSize:20.0f]}]; 
    if (labelSize.width > largestLabelWidth) { 
     largestLabelWidth = labelSize.width; 
    } 
} 
CGFloat popoverWidth = largestLabelWidth + 100;  //Add a little padding to the width 
self.preferredContentSize = CGSizeMake(popoverWidth, totalRowsHeight); 
return self; 
} 
7

iOS 7以上の場合。

- (CGSize)preferredContentSize { 
    return CGSizeMake(320, 550); 
} 

コンテナの子である場合は、自分自身にコンテンツサイズを変更してください。例えば。 - ちょうどpreferredContentSizeをオーバーライドして、前にそれがcontentSizeだ返すにレイアウトにテーブルビューを強制

- (CGSize)preferredContentSize { 
    return self.topViewController.preferredContentSize; 
} 
+0

ロバートのアプローチを試してみてください。それは非常にきれいで、この質問のために働く。あなたがUINavigationControllerの中にUITableViewを提示しているなら、あなたのためにはうまくいかないかもしれません。その場合、Avinash'sはうまくいくようです。 – DenVog

+0

@DenVog - 良い点。私は 'UINavigationController'をサブクラス化して、その優先ステータスバーをtopViewControllerから取得することを好みます。一般的には、2つのクラスが同じプロパティに対して異なる値でぶらつくことがあるバグを防ぐため、値を設定するよりも必要なものを宣言する方法があります。これは、iOS 7で 'preferredStatusBarStyle'が作成されたのと似ています。 – Robert

+0

これは私にとっては唯一の解決策でした。 self.preferredContentSizeを設定しても効果はありませんでした。 – pls

0

iOS8/9ソリューション:UINavigationControllerサブクラスで。 >TopMenuViewController - - >SubMenuViewController XN

+0

これはビューを拡大しますが、 'UINavigationController'階層に埋め込まれていると縮小しません。 – Mojo66

1
- (CGSize)preferredContentSize { 
    [self.tableView layoutIfNeeded]; 
    return self.tableView.contentSize; 
} 

私のアプリは、サブメニューがUINavigationControllerように、すなわち、何かをポップオーバー由来とナビゲーション・コントローラに埋め込まれたとメニューを有します。

上記の解決策のどれも私のために働いていませんでした。

私の解決策:他のすべてのメニューのビューコントローラが継承する私のルートメニューView Controllerクラスでは、次のコードを追加します。

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    self.navigationController.preferredContentSize = CGSizeMake(450.0f, 0.0f);// increase standard width (320.0) 
} 


- (void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 
    self.navigationController.preferredContentSize = self.tableView.contentSize; 
} 
0

これは私が使用するトリック

override func viewWillLayoutSubviews() { 
    super.viewWillLayoutSubviews() 

    self.preferredContentSize = CGSizeMake(0, self.tableView.contentSize.height)} 
関連する問題