69

我有一个包含 UINavigationController 的弹出框。我可以很好地显示弹出框,它包含导航控制器就好了。navController 包含一个 tableView,当我选择一个项目时,它会创建一个新的详细视图:

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

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

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

这就是问题发生的时候: 推送新视图后,弹出框会调整到 iPad 上可用的最大高度。

我尝试将xib中所有视图的高度设置为固定高度而不是灵活的。我已经尝试明确设置弹出框的高度。我也尝试过使用不同的视图控制器作为子视图。问题仍然存在:每当一个新视图被推送到导航控制器时,popover想要自动将自身调整到最大高度。

这是一个讨论在推送新视图时尝试故意控制弹出框大小的问题:

我认为这可能是控制大小的蛮力方法。然而,奇怪的是,它实际上会导致一些快速的图形怪癖(就好像视图是新的动画一样),然后继续按上述方式调整大小。

换句话说,某些东西实际上是在强制弹出框达到其最大高度,并且它似乎发生所有委托方法都被调用之后。

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

4

13 回答 13

123

在我遇到同样的问题后,这为我解决了这个问题(今天也是巧合):

编辑:在如此使用contentSizeForViewInPopover中不推荐使用。iOS7.0preferredContentSize

下面的原始答案

在你detailViewController添加这个:

- (void)viewWillAppear:(BOOL)animated {

    CGSize size = CGSizeMake(320, 480); // size of view in popover
    self.contentSizeForViewInPopover = size;

    [super viewWillAppear:animated];

}

您还想添加类似于原始 DeviceDetailViewController 的内容,以防止在点击背面 NavbarItem 时调整大小。

于 2010-08-11T16:04:05.193 回答
30

就像处理它一样viewWillAppear,另一种处理方法是覆盖contentSizeForViewInPopover。非常简洁:

-(CGSize)contentSizeForViewInPopover
{
    return self.view.bounds.size;
}
于 2011-08-04T15:54:06.200 回答
30

IOS5

我建议你这样做:

- (void)viewDidLoad {
    [super viewDidLoad];

    CGSize size = CGSizeMake(320, 480); // size of view in popover
    self.contentSizeForViewInPopover = size;

}
于 2011-10-14T19:42:16.720 回答
11

我有一个类似的问题。

我有一个来自工具栏中的按钮的弹出框。弹出框设置为特定大小。这是一个表格视图。当表格行被选中时,一个带有导航控制器的新视图控制器被调用。

选择后按钮后,Popover成为默认大小(我相信的320x1100),而不是我所期望的特定尺寸。

原始代码是:

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

我相信当涉及导航控制器并按下后退按钮时,它会导致弹出框默认为其默认大小。通过为视图控制器 myVC 添加 contentSizeForViewInPopover 属性,它强制使用特定大小。

希望这会有所帮助。

库尔特

于 2011-02-09T04:19:19.017 回答
9

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

- (void)viewDidLoad
{
    [super viewDidLoad];

    CGSize size = CGSizeMake(320, 768); // size of view in popover
    self.preferredContentSize = size;
}

UIViewController.contentSizeForViewInPopover在 iOS 7 中首先被弃用。

于 2014-02-12T15:39:14.670 回答
6

响应带有动画的图形故障:

如果您在其中创建带有 UINavigationController 的弹出框,则 UIPopoverController 动画与 UINavigation 控制器动画冲突。动画时会导致图形故障。要解决此问题,请在推送其他控制器或显示工具栏时将动画参数设置为 false。

推送视图控制器:

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

使工具栏可见:

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

设置动画:NO 将使动画在 UIPopoverController 中看起来正确。

于 2010-10-19T17:50:00.943 回答
5

为什么不在contentSizeForViewInPopover将下一个控制器推送到导航堆栈之前设置呢?无需设置尺寸viewWillAppear等。

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

适用于 IOS 5.1

于 2012-06-14T10:33:26.573 回答
4

对 borked 的建议略有不同(这为我指明了正确的方向,谢谢!),这是我在推动新控制器以在推动之前保持大小时所做的事情:

productViewController.contentSizeForViewInPopover = self.view.bounds.size;
self.contentSizeForViewInPopover = self.view.bounds.size;

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

我喜欢这个,因为我不必在每个视图控制器中硬编码弹出框值(很好,因为我在不同的高度使用它们)。

self.contentSizeForViewInPopover行是在用户回击时保留大小。我想你可以把这条线放在其他地方,比如viewWillAppear你喜欢的地方。

似乎工作...

于 2010-11-12T07:20:05.897 回答
2

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

self setContentSizeForViewInPopover:CGSizeMake(320, 500)];
于 2012-12-03T06:22:38.497 回答
2

有两种方法可以在情节提要中设置 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];
}

在过渡动画中,新视图将与顶部对齐,然后相应调整高度。

这样,您不必覆盖 contentSizeForViewInPopover,或在视图控制器中专门指定其他大小。这一切都在故事板上。

如果您的视图控制器之一具有可变高度,那么您确实需要像这样覆盖该视图中的 contentSizeForViewInPopover ...

- (CGSize)contentSizeForViewInPopover {
    return CGSizeMake(450, "calculate your height here");
}
于 2013-05-15T14:45:00.787 回答
1

这些东西可能已经工作过一次,但不适用于 xCode 6,其中 contentSizeForViewInPopover 已被弃用。幸运的是,它在故事板加载时受到尊重。我下载了一个 xml 编辑器(Xmplify)并破解了情节提要。将 key contentSizeForViewInPopover 设置为您想要的大小。保存并替换(先复制)故事板。

进一步来说 :

< viewController>

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

</viewController>
于 2014-12-16T15:31:28.840 回答
0

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

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

当出现弹出框一切正常时,按下 vc1 上的按钮并将 vc2 推到导航控制器

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

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

好的,现在工作...在我的控制器中添加 popover 属性

self.contentSizeForViewInPopover = (CGSize){400, 200};
self.navigationController.contentSizeForViewInPopover = self.contentSizeForViewInPopover;
self.popover.popoverContentSize = self.contentSizeForViewInPopover;
于 2012-12-01T08:53:57.987 回答
0

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

来自苹果文档

showViewController:sender: 和 showDetailViewController:sender: 方法提供了最具适应性和灵活性的方式来显示视图控制器。这些方法让呈现视图控制器决定如何最好地处理呈现。例如,容器视图控制器可能会将视图控制器合并为子视图控制器,而不是模态地呈现它。默认行为以模态方式呈现视图控制器。

于 2017-09-14T13:15:03.077 回答