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达到最大高度,并且似乎是在所有委托方法被调用之后发生的。
它是导航控制器吗? 有没有人看过这种东西?
这个问题在我遇到同样的问题之后就修复了(今天也恰巧):
编辑 :由于contentSizeForViewInPopover
在iOS7.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:方法为显示视图控制器提供了最自适应和最灵活的方式。 这些方法让呈现视图控制器决定如何最好地处理演示文稿。 例如,容器视图控制器可以将视图控制器作为一个孩子,而不是以模态方式呈现。 默认行为以模态方式呈现视图控制器。