当 UIPopoverController 包含的 UINavigationController 推送一个新控制器时,如何让我的 UIPopoverController 为其大小设置动画?
我在我的 iPad 应用程序UIPopover
中显示了一个。UIBarButtonItem
它包含一个UINavigationViewController
,它有一个设置窗口作为它的根视图控制器。设置窗口是UITableViewController
(样式设置为分组)的子类,点击它的任何单元格都会在导航控制器上推送不同的“选择器”视图控制器,它们也是UITableViewController
.
对于每个选择器视图,在 中viewDidAppear
,我进行了contentSizeForViewInPopover
适当的设置:
self.contentSizeForViewInPopover = CGSizeMake(320, self.items.count * 44);
但它并没有动画变化;当导航动画结束时,弹出框会捕捉到新的高度(宽度永远不会从 320 改变)。向后导航会动画大小变化(通过此答案中的技术完成),但向前导航永远不会。
我已经尝试获取对它所在和使用的弹出框的引用,setPopoverContentSize:animated:
但它不起作用。我查看了其他 问题无济于事。
如何让它始终正确地为大小变化设置动画?
更新:我已经建立了一个简单的测试项目来试试这个。这是在 Xcode 中设置的 iPad 的标签栏应用程序。我在其中一个视图控制器的导航栏中添加了一个标签栏项目。当按下该按钮时,控制器会显示一个弹出框,其中包含一个导航控制器,该控制器具有一个非常简单的UITableViewController
子类,称为TestContentViewController
,作为其根视图控制器。
在viewDidLoad
那个子类中,我随机生成了一些项目:
self.numItems = arc4random() % 10 + 3;
这是我的行数;节数为 1。cellForRowAtIndexPath
我只是设置单元格的标签文本并返回它。选择一行时,我会生成同一类的另一个实例,然后将其推在堆栈上。
无需contentSizeForViewInPopover
对任何 VC 上的属性进行任何操作,弹出框只会达到其最大高度并保持在那里,无论我的表视图中有多少行。
如果我在 viewDidAppear 中设置大小,如下所示:
-(void)viewDidAppear:(BOOL)animated
{
self.contentSizeForViewInPopover = CGSizeMake(320, self.numItems * 44);
[super viewDidAppear:animated];
{
- 当弹出框第一次出现时,它会非常快速地闪烁到全高,然后捕捉到我设置的高度。
- 当一个新的控制器被推到导航控制器上时,它会在没有动画的情况下捕捉到它的高度。
- 当我向后导航时,如果我弹出的 VC 比我弹出的那个高,它会动画到正确的大小。如果我弹出的内容更小,它什么也不做。
如果我做同样的事情但在viewWillAppear
:
- 当弹出框第一次出现时,它是全高的
- 当我第一次点击一行并在堆栈中获得一个新控制器时,它的动画高度至少约为 400 像素。当一个新的控制器被压入堆栈时,如果它需要更多的高度,它就会得到它。如果不是,它会保持以前的状态。
如果我在 中做同样的事情viewDidLoad
,它基本上是一样的,viewWillAppear
只是它最初以正确的大小出现。
我尝试将导航控制器的委托设置为呈现弹出框的 VC,然后将弹出框的高度 ( setPopoverContentSize:animated:
)设置navigationController:didShowViewController:animated:
为 我认为我在那里设置的大小需要考虑到内置于弹出框顶部的导航栏的额外高度。将新控制器推入堆栈时的动画很奇怪。
再次更新:请参阅此处以了解与较新的UIPopoverPresentationController
.