UIPopoverController在pushViewController上自动调整大小到最大高度

SG1*_*SG1 68 uinavigationcontroller uipopovercontroller

我有一个包含UINavigationController的popover.我可以很好地显示popover,它包含navController就好了.navController包含一个tableView,当我选择一个项目时,它会创建一个新的详细信息视图:

     DeviceDetailViewController *detailViewController = 
[[[DeviceDetailViewController alloc] initWithNibName:@"DeviceDetailViewController" bundle:nil] autorelease];
Run Code Online (Sandbox Code Playgroud)

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

    [self.navigationController pushViewController:detailViewController animated:YES];
Run Code Online (Sandbox Code Playgroud)

这是出现问题时: 之后的酥料饼调整大小以在iPad上可用的最大高度推新视图.

我已经尝试将xib中所有视图的高度设置为固定高度而不是灵活.我试过明确设置弹出窗口的高度.我也尝试使用不同的视图控制器作为子视图.问题仍然是:在酥料饼将自己调整到最大高度时会自动新视图推送到导航控制器.

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

我认为这可能是一种控制大小的强力方法.然而,奇怪的是,它实际上会导致一些快速的图形怪癖(好像视图正在进行动画处理),然后继续调整大小,如上所述.

换句话说,某些东西确实迫使popover达到其最大高度,并且似乎在调用所有委托方法之后发生.

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

bor*_*ked 123

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

编辑:正如contentSizeForViewInPopoveriOS7.0这样使用中弃用preferredContentSize.

原答案如下:

在你的detailViewController添加中:

- (void)viewWillAppear:(BOOL)animated {

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

    [super viewWillAppear:animated];

}
Run Code Online (Sandbox Code Playgroud)

您还希望添加类似于原始DeviceDetailViewController的内容,以防止在点击后面的NavbarItem时调整大小.

  • 谢谢!我有同样的问题,UIViewController的contentSizeForViewInPopover属性修复了它. (4认同)
  • 在至少一种情况下,我仍然必须明确设置弹出高度本身(如果弹出控制器已经以定义的高度可见).但是否则这适用于返回导航控制器中的前一页. (2认同)

Pet*_*ese 30

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

-(CGSize)contentSizeForViewInPopover
{
    return self.view.bounds.size;
}
Run Code Online (Sandbox Code Playgroud)


MUH*_*nc. 30

对于IOS5

我建议你这样做:

- (void)viewDidLoad {
    [super viewDidLoad];

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

}
Run Code Online (Sandbox Code Playgroud)


Kur*_*urt 11

我有类似的问题.

我从工具栏中的按钮出现了弹出窗口.弹出窗口设置为特定大小.这是一个表格视图.选择表格行时,会调用带有导航控制器的新视图控制器.

当选择后退按钮时,弹出窗口变为默认大小(我相信为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];
Run Code Online (Sandbox Code Playgroud)

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

  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];
Run Code Online (Sandbox Code Playgroud)

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

希望这是有帮助的.

库尔特


Abd*_*mer 9

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

- (void)viewDidLoad
{
    [super viewDidLoad];

    CGSize size = CGSizeMake(320, 768); // size of view in popover
    self.preferredContentSize = size;
}
Run Code Online (Sandbox Code Playgroud)

UIViewController.contentSizeForViewInPopover 已在iOS 7中首先弃用.


Pau*_*olt 6

为了响应动画的图形故障:

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

推送视图控制器:

[self.navigationController pushViewController:detailViewController animated:NO];
Run Code Online (Sandbox Code Playgroud)

使工具栏可见:

[[self navigationController] setToolbarHidden:NO animated:NO]; 
Run Code Online (Sandbox Code Playgroud)

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


MrJ*_*Jre 5

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

[nextController setContentSizeForViewInPopover:[self contentSizeForViewInPopover]];
[[self navigationController] pushViewController:nextController animated:YES];
Run Code Online (Sandbox Code Playgroud)

适用于IOS 5.1