如何dynamic更改UIPopoverController的contentSize?

我有一个包含UITableViewUIViewController 。 这个UIViewController被显示在一个UIPopoverController

现在,事情是在tableView的项目数量不是常数,我想popoverContentSize的大小(即 – popoverContentSize ),根据tableView的项目数量进行调整

天真地,我想,如果我将所有的项目加载tableView后,我将设置contentSizeForViewInPopoverviewDidLoad – 它会做到这一点。

它没有。

所以,使其简短,我的问题是:我怎么能改变popoverContentSize直接从contentViewController – 提交后?

附录: 在这里输入图像说明

我可能会很迟才回答,但对于iOS 7的新用户,请在UIViewController中使用以下行,即UIPopOverViewConotroller的 contentViewController

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

希望这将有助于iOS 7用户。

那么,最后,我做了一些我不确定是否是正确的事情,但它是行得通的。

我在我的contentViewController中添加了一个引用到popoverController:

 @property (nonatomic , assign) UIPopoverController *popoverControllerContainer; 

然后,我添加了resize的代码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]; } 

所以,保持对popover的参考是一种黑客行为,所以我很乐意听到更好的想法。

一个UIViewController类有属性

 self.contentSizeForViewInPopover 

这将调整popup窗口的大小,而不需要添加对它的引用。

为了扩展一个解决scheme,我使用了rectForSection方法:获取该部分的大小(我的只有一个部分,很容易得到),然后添加导航栏的高度(它似乎是20)。 所以我能够创buildpopover完成的表视图的大小:

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

我的应用程序有一个菜单,其中包含源自popup窗口并embedded到导航控制器中的子菜单,即像UINavigationController – > TopMenuViewController – > SubMenuViewController xN。

上述解决scheme都不适合我。

我的解决scheme:在我的根菜单视图控制器类,所有其他菜单视图控制器inheritance,添加以下代码:

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

我遇到了同样的问题,而且我find的答案都没有成功。 我拼凑在一起,认为我认为运作良好。

我有一个数组在我的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; } 

iOS8 / 9解决scheme – 只是覆盖preferredContentSize并强制表视图布局,然后返回它的contentSize

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

这应该做的伎俩

 override func viewWillLayoutSubviews() { super.viewWillLayoutSubviews() self.preferredContentSize = CGSizeMake(0, self.tableView.contentSize.height)}