如何动态更改UIPopoverController的contentSize?

时间:2011-12-15 07:49:32

标签: objective-c ios cocoa-touch ipad uipopovercontroller

我的UIViewController包含UITableView。 此UIViewController显示在UIPopoverController

现在,问题是tableView中的项目数量不是常数,我希望弹出窗口的大小(即popoverContentSize)根据数量进行调整tableView

中的项目

天真地,我想,如果我在contentSizeForViewInPopover加载所有项目之后将viewDidLoad设置在tableView中,它就会这样做。

没有。

所以简而言之,我的问题是:如何在popoverContentSize之后直接更改contentViewController

附录: enter image description here

8 个答案:

答案 0 :(得分:47)

对于来自iOS 7的新用户,我可能很晚才回答 请使用 UIViewController 中的以下行, UIPopOverViewConotroller contentViewController

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

希望这对iOS 7用户有所帮助。

答案 1 :(得分:9)

嗯,最后我做了一些事我不确定这是否正确,但是它正在发挥作用。

我在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];
}

所以,保持对popover的引用有点像hack-ish,所以我愿意听到更好的想法。

答案 2 :(得分:7)

UIViewController类具有属性

self.contentSizeForViewInPopover

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

为了扩展解决方案,我使用方法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;
对于多个部分,

可能会更加困难,我没有尝试过。应该能够总结一段高度,但可能会有一些我不知道的间距问题。

答案 3 :(得分:7)

适用于iOS 7或更高版本。

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

如果您是容器的孩子,请将内容大小重定向给自己。例如。在UINavigationController子类中:

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

答案 4 :(得分:1)

我的应用程序有一个菜单,其子菜单源自弹出窗口并嵌入在导航控制器中,例如UINavigationController - &gt; TopMenuViewController - &gt; 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;
}

答案 5 :(得分: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;
}

答案 6 :(得分:0)

iOS8 / 9解决方案 - 只需覆盖preferredContentSize并在返回表contentSize之前强制将表格视图布局。

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

答案 7 :(得分:0)

这应该可以解决问题

override func viewWillLayoutSubviews() {
  super.viewWillLayoutSubviews()

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