16

我有一个带有子类 UINavigationController 的 UIPopoverController。父视图和子视图都是 UITableview。

当我最初使用 contentSizeForViewInPopover = (320,480) 调用父视图时,效果很好。

当我单击子视图时,我将弹出框的大小调整为 contentSizeForViewInPopover = (320,780)

当返回父视图时,我无法将弹出框调整回 contentSizeForViewInPopover = (320,480)。弹出框保持在 (320,780) 大小。

一直在尝试一切,但只是错过了一些东西。任何人都知道在上述情况下如何使用 UIPopoverControllers 调整视图大小?

提前致谢!!

4

6 回答 6

24

视图控制器的contentSizeForViewInPopover属性仅设置其包含的默认(初始)大小UIPopoverController。要UIPopoverController在任意时间调整大小,您必须设置其popoverContentSize属性。请注意,这popoverContentSize是视图控制器的属性,UIPopoverController不是视图控制器的属性(因此您可能需要对弹出框控制器的引用)。

要在每次视图控制器成为 a 的顶部视图控制器时重置弹出框的大小UINavigationController,您可以使用UINavigationControllerDelegate协议方法:

navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    if (viewController == viewControllerToResize) {
        referenceToUIPopoverController.popoverContentSize = CGSizeMake(320,480);
    }
}
于 2010-08-02T18:37:46.620 回答
13

我遇到了同样的问题,但上述解决方案都不适合我。然而,在尝试结合他们的方法时,我受到启发,尝试了一种稍微不同的方法来解决问题。这对我有用:

-(void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    viewController.contentSizeForViewInPopover = navigationController.topViewController.view.frame.size;
}

我有三个不同的弹出窗口,每个都使用导航视图控制器。这个解决方案有一个很好的副作用,因为它没有对任何弹出框控制器进行特定引用,但最终使用了当前正在使用的弹出框控制器中的 popoverContentSize。

于 2011-08-18T22:22:43.473 回答
2

在我的项目中,我必须动态更改弹出框的大小。

我制作了弹出框内容控制器的原始控制器委托,并实现了每次更改大小时调用的委托方法:

代码如下,希望对某人有所帮助:

-(void) popover:(UIViewController*)controller didChangeSize:(CGSize)size{

    if ([controller class] == [AZViewController class]){
        if (!_popoverController){
            _popoverController = [[UIPopoverController alloc] initWithContentViewController:controller]; 
        }

        _popoverController.popoverContentSize = size;
    }
}
于 2011-05-24T09:51:46.290 回答
1

我想我遇到了同样的问题,我通过在每次视图即将出现时在弹出窗口中设置视图的大小来解决它。像这样:

-(void)viewWillAppear:(BOOL)动画{
    [超级viewWillAppear:动画];

    self.contentSizeForViewInPopover = CGSizeMake(320, 444); //设置自己的大小
}

我希望这可以帮助你。

于 2010-06-01T14:19:10.940 回答
1

我想我可能已经想通了,因为我在这个问题上挣扎了一段时间。可能有点乐观,所以如果此解决方案不适合您,请随时发表评论。

在与导航层次结构一起显示的每个 viewController 中,将 viewDidAppear: 方法中的 contentSizeForViewInPopover 属性设置为适当的大小。

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    [self setContentSizeForViewInPopover:CGSizeMake(320, 320)];
}

我发现的另一件事是,在编辑 textField 时点击返回时,大小保持较小,而不是较大的先前视图。在控制器的 viewWillDisappear 中的 textField 上调用 resignFirstResponder 方法。

我很好奇这个解决方案是否适用于 sdks。

于 2011-09-13T08:01:06.307 回答
0

在尝试了很多事情之后,@chuck-k 的回答帮助我体面地解决了 iOS7 中的 UINavigationController 弹出框问题。

这是我所做的:

  • 对于 UINavigationController 中的每个 UIViewController 我计算我想要在方法- (CGSize)contentSizeForViewInPopover plus中显示的内容大小navigationController.navigationBar.frame.size.height(我认为它总是 44)。我没有在这些 UIViewController 中使用任何其他弹出框功能。

  • 我将创建 UINavigationController 的 UIViewController 声明为 UINavigationControllerDelegate

  • 然后在委托中......

......

- (void)navigationController:(UINavigationController *)navigationController willShowViewController: (UIViewController *)viewController animated:(BOOL)animated {

    BOOL popoverAnimation = NO;

    if ( self.myPopoverController.popoverContentSize.height < viewController.contentSizeForViewInPopover.height ) popoverAnimation = YES;

    [self.myPopoverController setPopoverContentSize:viewController.contentSizeForViewInPopover animated:popoverAnimation];
}

高度检查将当前视图控制器的弹出框内容大小与“传入”视图控制器弹出框内容大小进行比较。当从较大的 --> 较小的弹出框内容大小开始时,我使用动画 = NO,否则我会在 iOS7 中得到一些生涩的重新定位动画。但特别是如果动画 = NO当从更小 --> 更大的弹出框内容大小开始时,弹出框大小会增加到我期望的大小,不会显示比以前更小的内容大小更大的内容......设置动画= YES已解决这个问题对我来说。(我只检查高度,因为在我的情况下宽度是固定的。)

通过使用这种技术,几乎所有的东西最终都能让我满意,我希望这可能对其他人有所帮助。

于 2013-10-31T00:45:44.763 回答