带有UINavigationController的UIPopoverController子视图contentSizeForViewInPopover不适用于Parent

时间:2010-05-28 02:25:45

标签: iphone resize uipopovercontroller

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

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

当我点击子视图时,我将popover的大小调整为contentSizeForViewInPopover =(320,780)

当返回到父视图时,我无法让popover重新调整为contentSizeForViewInPopover =(320,480)。 popover保持在(320,780)大小。

尝试了一切,但只是遗漏了一些东西。在上面的场景中,任何人都知道如何使用UIPopoverControllers调整视图大小?

先谢谢!!

6 个答案:

答案 0 :(得分:24)

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

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

navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    if (viewController == viewControllerToResize) {
        referenceToUIPopoverController.popoverContentSize = CGSizeMake(320,480);
    }
}

答案 1 :(得分:13)

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

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

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

答案 2 :(得分:2)

在我的项目中,我必须动态地改变弹出窗口的大小。

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

代码如下:希望它有助于某人:

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

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

        _popoverController.popoverContentSize = size;
    }
}

答案 3 :(得分:1)

我认为我遇到了同样的问题,每次视图即将出现时,我都会通过在popover中设置视图的大小来解决它。像这样:


-(void)viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];

    self.contentSizeForViewInPopover = CGSizeMake(320, 444); //Set your own size
}

我希望这会对你有所帮助。

答案 4 :(得分:1)

我想我可能已经想到了这一点,因为我现在已经讨论了这个问题了一段时间。可能会有点乐观,所以如果这个解决方案不适合你,请随时评论。

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

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

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

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

答案 5 :(得分:0)

在尝试了很多东西之后,@ chuck-k的答案帮助我在iOS7中正确地解决了我的UINavigationController popover问题。

这就是我的所作所为:

  • 对于UINavigationController中的每个UIViewController,我计算了我希望在方法- (CGSize)contentSizeForViewInPopovernavigationController.navigationBar.frame.size.height中显示的内容大小(我认为总是44)。我在这些UIViewControllers中没有使用任何其他popover功能。

  • 我宣布我的UIViewController创建UINavigationController为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];
}

高度检查将当前视图控制器的弹出窗口内容大小与“传入”视图控制器弹出窗口内容大小进行比较。从更大的时候我使用 animation = NO - &gt;较小的 popover内容大小,因为否则我会在iOS7中获得一些生涩的重新定位动画。但特别是当动画=否时,从较小 - >&gt;较大的弹出窗口内容大小, popover 大小将增加到我预期的不会显示内容的大小较小的内容大小...设置动画=是为我解决了这个问题。 (我只检查高度,因为在我的情况下,宽度是固定的。)

通过使用这种技术,几乎所有的东西终于让我满意,我希望这可以帮助别人。