不正确的 Popover 大小 - 在 Popover 中的 Navigation Controller 下显示 UITableViews 时

Posted

技术标签:

【中文标题】不正确的 Popover 大小 - 在 Popover 中的 Navigation Controller 下显示 UITableViews 时【英文标题】:Incorrect Popover size - when displaying UITableViews under Navigation Controller in Popover 【发布时间】:2012-12-16 21:57:41 【问题描述】:

我正在编写一个 iPad 应用程序,该应用程序具有在 UIPopoverController 内的导航控制器下显示的 UITableViews。

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

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

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

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

【问题讨论】:

【参考方案1】:

由于上述解决方案不再有效,这里有一个更新的 (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 

【讨论】:

【参考方案2】:

我从用户@krasnyk 的以下 *** 帖子中实现了答案:

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

一个改动对我来说效果很好......

基本上添加了上述帖子中详述的相同功能,但只进行了一次修改(我在 PopupController 的视图层次结构中硬编码了每个 VC 的大小)

我引用此函数在 ViewDidLoad 和 ViewDidAppear 函数中为我的 PopoverController 中显示的 VC 链中的每个 VC 设置正确的弹出框大小。

- (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;

【讨论】:

以上是关于不正确的 Popover 大小 - 在 Popover 中的 Navigation Controller 下显示 UITableViews 时的主要内容,如果未能解决你的问题,请参考以下文章

React -- Material UI -- Popover, setAnchorEl(null) onClose 的 popover 出于某种原因没有将其设置为 null

显示键盘 + iPad 时 UIPopoverView 变得扭曲

Popover 适配内容大小 IOS

无法让 Popover 在对话框中的正确位置显示

弹出框内容视图的额外高度

如何设置 Popover 视图以正确关闭