弹出窗口大小不正确 - 在Popover中的导航控制器下显示UITableViews时

时间:2012-12-16 21:57:41

标签: ios ipad uinavigationcontroller uitableview uipopovercontroller

我正在编写一个iPad应用程序,其中包含在UIPopoverController内的导航控制器下显示的UITableViews。

当我在我的应用程序的主视图控制器中选择一个按钮时,会显示弹出窗口。弹出窗口打开显示第一个TableViewController,它有两行(UITableViewCells) - 第一行中的“Search”和第二行中的“Advanced Settings”。在初始显示时,弹出框的大小足以显示两行。

我已经编写了第一个TableViewController的didSelectRowAtIndexPath,这样当我选择“Search”时,它会将第二个TableViewController推送到NavigationViewController上。下一个View Controller允许用户执行搜索,然后在其tableview中填充搜索结果。)此(搜索结果)表视图控制器的大小足以容纳搜索返回的所有行。因此,当显示搜索tableview控制器时,搜索弹出窗口会变长。

当我取消搜索(或点击导航栏中的后退按钮)时,popover返回显示第一个表视图控制器(只有两行的控制器)。但是,第一个表视图控制器现在具有更长的尺寸。换句话说,popover而不是将自身调整回两行表,仍然是第二个(搜索结果)表视图控制器的大小(因此它现在有两行“搜索”和“高级设置”加上一个数字空行)

我的问题是:如何在此实现中的层次结构中获取每个tableview控制器(即表视图控制器在导航控制器下的弹出框中显示),以便单独调整大小并在用户返回其原始大小时向后和向前导航。可能有一个简单的解决方案,但它逃脱了我!感谢有人能指出我的解决方案。

2 个答案:

答案 0 :(得分:2)

由于上述解决方案不再适用,因此这是一个更新的(Swift)替代方案。

您可以将popovercontroller传递给destinationViewControllers。 然后在viewWillAppear()中调用preferredContentSizeDidChangeForChildContentContainer,弹出窗口将自动调整大小。

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    if let ppc = popoverController  {
        ppc.preferredContentSizeDidChangeForChildContentContainer(self)
    }
}

如果它不起作用,请确保正确实现preferredContentSize。例如,使用单个部分计算tableViewController的大小:

override var preferredContentSize: CGSize {
    get {
        let sectionFrame    = self.tableView.rectForSection(0)
        let titleOnTop      = self.navigationController!.navigationBar.frame.height
        let height          = sectionFrame.height + titleOnTop
        return CGSize(width: super.preferredContentSize.width, height: height)
    }
    set { super.preferredContentSize = newValue }
}

答案 1 :(得分:1)

我通过用户@krasnyk实现了以下StackOverflow帖子的答案:

Popover with embedded navigation controller doesn't respect size on back nav

一次改变对我有用......

基本上添加了上面帖子中详细介绍的相同功能,只进行了一次修改(我在PopupController的视图中对每个VC进行了硬编码)

我引用了这个函数,在我的PopoverController中显示的VC链中的每个VC的ViewDidLoad和ViewDidAppear函数中设置正确的popover大小。

- (void) correctPopoverContentSize {
    //
    // removed the following line from the original code in above post as it did not
    // work for me 
    //      CGSize currentSetSizeForPopover = self.contentSizeForViewInPopover; 

    CGSize currentSetSizeForPopover = CGSizeMake(320.0f, 180.0f);
    CGSize fakeMomentarySize = CGSizeMake(currentSetSizeForPopover.width - 1.0f,    
           currentSetSizeForPopover.height - 1.0f);
    self.contentSizeForViewInPopover = fakeMomentarySize;
    self.contentSizeForViewInPopover = currentSetSizeForPopover;
}