web-dev-qa-db-ja.com

UIPopoverControllerのcontentSizeを動的に変更する方法は?

UIViewControllerを含むUITableViewがあります。このUIViewControllerUIPopoverControllerに表示されています。

さて、問題はtableViewの項目数が一定ではなく、ポップオーバー(つまりpopoverContentSize)のサイズを、 tableViewのアイテム

単純に、contentSizeForViewInPopoverにすべての項目をロードした後でviewDidLoadtableViewを設定すると、それでうまくいくと思っていました。

ありませんでした。

つまり、短くしておくと、私の質問は、popoverContentSizecontentViewControllerから直接変更するにはどうすればよいですか?

付録: enter image description here

26
Avi Shukron

私は答えるのが非常に遅いかもしれませんが、iOS 7の新しいユーザーの場合は、IViewControllerの次の行を使用してくださいIViewOverViewConotrollercontentViewController

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

これがiOS 7ユーザーにとって役立つことを願っています。

47
Avinash

さて、結局私はそれが正しいことかどうかわからないことをしましたが、それはうまくいきました。

ContentViewControllerの参照をpopoverControllerに追加しました。

@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];
}

したがって、ポップオーバーへの参照を維持することは一種のハックっぽいので、より良いアイデアを聞く機会があります。

9
Avi Shukron

IViewController クラスにはプロパティがあります

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;

複数のセクションを使用すると、より困難になる可能性があるため、試さなかった。単にセクションの高さを合計できるはずですが、私が知らないいくつかの間隔の問題があるかもしれません。

7
Padin215

IOS 7以降の場合。

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

コンテナの子である場合は、コンテンツサイズを自分にリダイレクトします。例えば。 UINavigationControllerサブクラスでは:

- (CGSize)preferredContentSize {
    return self.topViewController.preferredContentSize;
}
6
Robert

私のアプリには、ポップオーバーから発生し、ナビゲーションコントローラーに埋め込まれたサブメニューがあるメニューがあります。つまり、UINavigationController-> TopMenuViewController-> SubMenuViewControllerxNなどです。

上記の解決策のどれも私にとってうまくいきませんでした。

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

- (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;
}
1
Mojo66

私はこれと同じ問題を抱えていて、私が見つけた答えはどれもうまくいきませんでした。私はうまくいくと思って一緒に石畳を作りました。

私の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;
}
0

これでうまくいくはずです

override func viewWillLayoutSubviews() {
  super.viewWillLayoutSubviews()

  self.preferredContentSize = CGSizeMake(0, self.tableView.contentSize.height)}
0
user431791

iOS8/9ソリューション-preferredContentSizeをオーバーライドし、contentSizeを返す前にテーブルビューを強制的にレイアウトします。

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