Ios Popover大小不正确-在Popover中的导航控制器下显示UITableView时
我正在编写一个iPad应用程序,其特点是UIPopoverController中的导航控制器下显示UITableViewIos Popover大小不正确-在Popover中的导航控制器下显示UITableView时,ios,ipad,uinavigationcontroller,uitableview,uipopovercontroller,Ios,Ipad,Uinavigationcontroller,Uitableview,Uipopovercontroller,我正在编写一个iPad应用程序,其特点是UIPopoverController中的导航控制器下显示UITableView - (void) correctPopoverContentSize { // // removed the following line from the original code in above post as it did not // work for me // CGSize currentSetSizeForPopo
- (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;
}
当我在我的应用程序的主视图控制器中选择一个按钮时,会显示弹出窗口。弹出窗口打开,显示第一个TableViewController,它有两行(UITableViewCells)-“搜索”在第一行,而“高级设置”在第二行。在初始显示时,popover的大小刚好足以显示这两行
我对第一个TableViewController的didSelectRowAtIndexPath进行了编码,这样当我选择“搜索”时,它会将第二个TableViewController推送到NavigationViewController上。此下一个视图控制器允许用户执行搜索,然后在其tableview中填充搜索结果。)此(搜索结果)表视图控制器的大小足以容纳搜索返回的所有行。因此,当显示search tableview控制器时,搜索弹出框变长
当我取消搜索(或点击导航栏中的后退按钮)时,弹出窗口将返回显示第一个表视图控制器(只有两行的那个)。但是,第一个表视图控制器现在具有更长的大小。换句话说,popover并没有将自身大小调整回两行表,而是保持第二个(搜索结果)表视图控制器的大小(因此它现在有两行“搜索”和“高级设置”以及许多空行)
我的问题是:如何在此实现中使层次结构中的每个tableview控制器(即,在导航控制器下的popover中显示tableview控制器)分别调整大小,并在用户来回导航时恢复到其原始大小。这可能有一个简单的解决办法,但我想不通!如果有人能为我提供解决方案,我将不胜感激。我通过user@krasnyk从下面的StackOverflow帖子中实现了答案: 这对我来说非常有效,只需要一个改变 基本上添加了与上面文章中详述的相同的功能,只做了一次修改(我在PopupController中的视图继承人中硬编码了每个VC的大小) 我引用此函数是为了在ViewDidLoad和ViewDidAspect函数中为我的PopoverController中显示的VCs链中的每个VC设置正确的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;
}
我通过user@krasnyk实现了以下StackOverflow帖子中的答案: 这对我来说非常有效,只需要一个改变 基本上添加了与上面文章中详述的相同的功能,只做了一次修改(我在PopupController中的视图继承人中硬编码了每个VC的大小) 我引用此函数是为了在ViewDidLoad和ViewDidAspect函数中为我的PopoverController中显示的VCs链中的每个VC设置正确的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;
}
由于上述解决方案不再有效,这里有一个更为流行(快速)的替代方案 您可以将popovercontroller传递给DestinationViewController。 然后在viewwillbeen()中调用PreferredContentSizedChangeForChildContentContainer,弹出框将自动调整大小
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 }
}
由于上述解决方案不再有效,这里有一个更为流行(快速)的替代方案 您可以将popovercontroller传递给DestinationViewController。 然后在viewwillbeen()中调用PreferredContentSizedChangeForChildContentContainer,弹出框将自动调整大小
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 }
}