UIPopoverController在pushViewController上自动resize到最大高度

我有一个包含UINavigationController的popup窗口。 我可以显示popup窗口,它包含navController就好了。 navController包含一个tableView,当我select一个项目时,它会创build一个新的细节视图:

DeviceDetailViewController *detailViewController = [[[DeviceDetailViewController alloc] initWithNibName:@"DeviceDetailViewController" bundle:nil] autorelease]; 

然后我推它新的视图控制器:

  [self.navigationController pushViewController:detailViewController animated:YES]; 

这是问题发生的时间:推新视图后,popup窗口调整到iPad上可用的最大高度。

我已经尝试将xib中所有视图的高度设置为固定高度,而不是灵活。 我已经尝试明确设置popover的高度。 我也尝试使用不同的视图控制器作为子视图。 问题依然存在:每当将新视图推送到导航控制器时,popup窗口就会自动调整到最大高度。

这里有一个问题 ,讨论试图在推送新视图时故意控制popover的大小:

我认为这可能是一个蛮力的方法来控制大小。 奇怪的是,它实际上导致了一些快速的graphics怪异(好像视图正在被新鲜地animation),然后如上所述继续resize。

换句话说,某些东西是强制popup达到最大高度,并且似乎是所有委托方法被调用之后发生的。

它是导航控制器吗? 有没有人看过这种东西?

这个问题在我遇到同样的问题之后就修复了(今天也恰巧):

编辑 :由于contentSizeForViewInPopoveriOS7.0被弃用,所以使用preferredContentSize

下面的原始答案

在你的detailViewController添加这个:

 - (void)viewWillAppear:(BOOL)animated { CGSize size = CGSizeMake(320, 480); // size of view in popover self.contentSizeForViewInPopover = size; [super viewWillAppear:animated]; } 

您还想添加类似于您的原始DeviceDetailViewController的东西,以防止在点击后面的NavbarItem时resize。

很像在viewWillAppear处理它,处理这个问题的另一种方法是重载contentSizeForViewInPopover 。 非常简洁:

 -(CGSize)contentSizeForViewInPopover { return self.view.bounds.size; } 

对于IOS5

我build议你这样做:

 - (void)viewDidLoad { [super viewDidLoad]; CGSize size = CGSizeMake(320, 480); // size of view in popover self.contentSizeForViewInPopover = size; } 

我有一个类似的问题。

我有一个工具栏中的buttonpopup。 popover被设置为特定的大小。 这是一个表格视图。 当选中表格行时,会调用一个带有导航控制器的新视图控制器。

当后退button被选中,popup成为默认大小(我相信320×1100),而不是我想要的具体大小。

原来的代码是:

  MyTableViewController *myVC = [[MyTableViewController alloc] init]; UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:myVC]; UIPopoverController *popover = [[UIPopoverController alloc] initWithContentViewController:navController]; popover.delegate = self; popover.popoverContentSize = CGSizeMake(400.0, 500.0); [myVC release]; [navController release]; [popover release]; 

我添加了一行来解决这个问题。 当然,这是一种工作,因为我不得不减去标题的高度。 也许你们中的一个可以用更好的方法给我启发。 无论如何,它的工作。

  MyTableViewController *myVC = [[MyTableViewController alloc] init]; UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:myVC]; UIPopoverController *popover = [[UIPopoverController alloc] initWithContentViewController:navController]; popover.delegate = self; popover.popoverContentSize = CGSizeMake(400.0, 500.0); //Subtract the height of the header to match the total popover size (not just the view). myVC.contentSizeForViewInPopover = CGSizeMake(400.0, 500-44); [myVC release]; [navController release]; [popover release]; 

我相信,当涉及到一个导航控制器,并按下后退button,它会导致popup窗口默认为其默认大小。 通过为视图控制器myVC添加contentSizeForViewInPopover属性,它强制特定的大小。

希望这是有帮助的。

库尔特

对于iOS 7,请使用以下内容:

 - (void)viewDidLoad { [super viewDidLoad]; CGSize size = CGSizeMake(320, 768); // size of view in popover self.preferredContentSize = size; } 

在iOS 7中, UIViewController.contentSizeForViewInPopover已经被弃用。

针对animation中的graphics故障:

UIPopoverControlleranimation与UINavigation控制器animation冲突,如果您在其中使用UINavigationController创buildpopup窗口。 animation时会导致graphics故障。 要解决此问题,请在推动其他控制器或显示工具栏时将animation参数设置为false。

推视图控制器:

 [self.navigationController pushViewController:detailViewController animated:NO]; 

使工具栏可见:

 [[self navigationController] setToolbarHidden:NO animated:NO]; 

设置animation:NO将使animation在UIPopoverController中看起来是正确的。

在将下一个控制器推入导航堆栈之前,为什么不直接设置contentSizeForViewInPopover ? 无需在viewWillAppear等设置大小。

 [nextController setContentSizeForViewInPopover:[self contentSizeForViewInPopover]]; [[self navigationController] pushViewController:nextController animated:YES]; 

适用于IOS 5.1

在borked的build议(指出我在正确的方向,感谢这一点!)略有变化,这是我推动一个新的控制器保持大小之前,推动它:

 productViewController.contentSizeForViewInPopover = self.view.bounds.size; self.contentSizeForViewInPopover = self.view.bounds.size; [self.navigationController pushViewController:productViewController animated:YES]; 

我喜欢这个,因为我不必硬编码每个视图控制器中的popup窗口值(因为我在各种高度使用它们都是好的)。

self.contentSizeForViewInPopover行是为了在用户回退时保留大小。 我想你可以把这条线放在别的地方,比如viewWillAppear或者任何你喜欢的地方。

似乎工作…

在导航中使用的所有视图控制器的 – (void)viewDidLoad中,写入代码:

 self setContentSizeForViewInPopover:CGSizeMake(320, 500)]; 

有两种方法可以在故事板中设置contentSizeForViewInPopover。 您可以将您的导航控制器的视图控制器设置为FreeForm,并将根视图设置为所需的大小。 或者,您可以保持模拟指标推断,并选中“使用显式大小”,并设置你想要的大小。

然后,在导航控制器中的每个视图控制器中,添加以下内容…

 - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; ["yourpopoverController" setPopoverContentSize:CGSizeMake(self. contentSizeForViewInPopover.width, seld.contentSizeForViewInPopover.height + self. navigationController.navigationBar.frame.size.height) animated:YES]; } 

在过渡animation中,新视图将与顶部alignment,然后高度将相应调整。

这样,您不必重写contentSizeForViewInPopover,或者在视图控制器中专门指定其他大小。 这全在故事板上。

如果你的一个视图控制器有一个可变的高度,那么你确实需要在该视图中重写contentSizeForViewInPopover像这样…

 - (CGSize)contentSizeForViewInPopover { return CGSizeMake(450, "calculate your height here"); } 

这个东西可能曾经工作过一次,但不适用于xCode 6,其中contentSizeForViewInPopover已弃用。 幸运的是,它是故事板载入时间的尊重。 我下载了一个xml编辑器(Xmplify),并破解了故事板。 将关键字contentSizeForViewInPopover设置为所需的大小。 保存并replace(制作一个副本)故事板。

进一步来说 :

 < viewController> <value key="contentSizeForViewInPopover" type="size" width="450" height="280" / > </viewController> 

不要为我工作,当我使用这个:

 [UIPopoverController [UINavigationController] = root vc = [UIViewController vc1] => [UIViewController vc2] ] 

当出现popup窗口时,按vc1上的button并将vc2推到导航控制器

接下来返回vc1(root)在vc2中按下button(popToRootViewController方法);

我们可以看到,popover改变了自己的大小,但vc1的大小是旧的…这是什么?

好吧,现在工作…在我的控制器添加popup属性

 self.contentSizeForViewInPopover = (CGSize){400, 200}; self.navigationController.contentSizeForViewInPopover = self.contentSizeForViewInPopover; self.popover.popoverContentSize = self.contentSizeForViewInPopover; 

运行Swift 4和iOS 11是我唯一可能的解决scheme。 使用showViewController:sender: and showDetailViewController:sender:而不是presentViewController:animated:completion:

从苹果文件

showViewController:sender:和showDetailViewController:sender:方法为显示视图控制器提供了最自适应和最灵活的方式。 这些方法让呈现视图控制器决定如何最好地处理演示文稿。 例如,容器视图控制器可以将视图控制器作为一个孩子,而不是以模态方式呈现。 默认行为以模态方式呈现视图控制器。