UIViewController
を含むUITableView
があります。このUIViewController
はUIPopoverController
に表示されています。
さて、問題はtableView
の項目数が一定ではなく、ポップオーバー(つまりpopoverContentSize
)のサイズを、 tableView
のアイテム
単純に、contentSizeForViewInPopover
にすべての項目をロードした後でviewDidLoad
にtableView
を設定すると、それでうまくいくと思っていました。
ありませんでした。
つまり、短くしておくと、私の質問は、popoverContentSize
をcontentViewController
から直接変更するにはどうすればよいですか?
付録:
私は答えるのが非常に遅いかもしれませんが、iOS 7の新しいユーザーの場合は、IViewControllerの次の行を使用してくださいIViewOverViewConotrollerのcontentViewController
-(void) viewDidAppear:(BOOL)animated{
[super viewDidAppear:animated];
self.preferredContentSize=myTableView.contentSize;
}
これがiOS 7ユーザーにとって役立つことを願っています。
さて、結局私はそれが正しいことかどうかわからないことをしましたが、それはうまくいきました。
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];
}
したがって、ポップオーバーへの参照を維持することは一種のハックっぽいので、より良いアイデアを聞く機会があります。
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;
複数のセクションを使用すると、より困難になる可能性があるため、試さなかった。単にセクションの高さを合計できるはずですが、私が知らないいくつかの間隔の問題があるかもしれません。
IOS 7以降の場合。
- (CGSize)preferredContentSize {
return CGSizeMake(320, 550);
}
コンテナの子である場合は、コンテンツサイズを自分にリダイレクトします。例えば。 UINavigationController
サブクラスでは:
- (CGSize)preferredContentSize {
return self.topViewController.preferredContentSize;
}
私のアプリには、ポップオーバーから発生し、ナビゲーションコントローラーに埋め込まれたサブメニューがあるメニューがあります。つまり、UINavigationController
-> TopMenuViewController
-> SubMenuViewController
xNなどです。
上記の解決策のどれも私にとってうまくいきませんでした。
私の解決策:他のすべてのメニュービューコントローラーが継承するルートメニュービューコントローラークラスに、次のコードを追加します。
- (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;
}
私はこれと同じ問題を抱えていて、私が見つけた答えはどれもうまくいきませんでした。私はうまくいくと思って一緒に石畳を作りました。
私の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;
}
これでうまくいくはずです
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
self.preferredContentSize = CGSizeMake(0, self.tableView.contentSize.height)}
iOS8/9ソリューション-preferredContentSize
をオーバーライドし、contentSize
を返す前にテーブルビューを強制的にレイアウトします。
- (CGSize)preferredContentSize {
[self.tableView layoutIfNeeded];
return self.tableView.contentSize;
}