不正确的 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