如何动态更改UIPopoverController的contentSize?

Avi*_*ron 26 cocoa-touch objective-c ipad uipopovercontroller ios

我有一个UIViewController包含一个UITableView.这UIViewController是在一个显示UIPopoverController.

现在,事情是,物品的数量tableView不是恒定的,我想要弹出的大小(即 - popoverContentSize),根据物品的数量进行调整tableView

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

它没有.

所以简而言之,我的问题是:如何popoverContentSize直接改变contentViewController- 在它被呈现之后?

附录: 在此输入图像描述

Avi*_*ash 47

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

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

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

  • 这在ViewWillAppear中可能会更好,因为它在视图出现之前发生. (9认同)

Avi*_*ron 9

好吧,最后我做了一些事我不确定这是不是正确的事情,但它确实有效.

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

@property (nonatomic , assign) UIPopoverController *popoverControllerContainer;
Run Code Online (Sandbox Code Playgroud)

然后,我将调整大小代码添加到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];
}
Run Code Online (Sandbox Code Playgroud)

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


Pad*_*215 7

一个的UIViewController类具有属性

self.contentSizeForViewInPopover
Run Code Online (Sandbox Code Playgroud)

这将调整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;
Run Code Online (Sandbox Code Playgroud)

多个部分可能会更难,我没试过.应该只能总结一段高度,但可能会有一些我不知道的间距问题.

  • 不推荐使用,使用iOS7及更高版本的"preferredContentSize". (2认同)

Rob*_*ert 6

适用于iOS 7或更高版本.

- (CGSize)preferredContentSize {
    return CGSizeMake(320, 550);
}
Run Code Online (Sandbox Code Playgroud)

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

- (CGSize)preferredContentSize {
    return self.topViewController.preferredContentSize;
}
Run Code Online (Sandbox Code Playgroud)