UINavigationController pushViewController:animated: 表现出奇怪的动画行为

Posted

技术标签:

【中文标题】UINavigationController pushViewController:animated: 表现出奇怪的动画行为【英文标题】:UINavigationController pushViewController:animated: exhibits strange animation behavior 【发布时间】:2013-09-27 14:24:14 【问题描述】:

我有一个现有的 ios 应用程序要移植到 iOS 7。iPad 版本在 UIPopoverController 中使用 UINavigationController。初始视图控制器的显示工作正常。当我使用 pushViewController:animated 和动画 = YES 推动另一个视图控制器时,新控制器会按预期从右侧动画化,然后它就像被弹起并弹回原位一样。同时,popover 控制器变得更大了一点。

如果我关闭动画,我仍然可以调整大小但不会反弹。但是我也没有得到新视图控制器的演示动画。

此时我正在寻找线索。我会发布代码,但由于这一切都在 iPhone 和 iPad 上运行并自动检测视图控制器是否需要在新的导航控制器中呈现,以及该导航控制器是否需要出现在弹出框控制器中这一事实而变得复杂。我没有让它变得复杂,而是在寻找为什么会发生这种情况的想法,以便我可以追踪问题。

相同的代码在 iOS 5 和 6 中运行良好。

如果有人在 iOS 7 中成功地做到这一点会很有趣 - 只需在 UIPopoverController 中显示 UINavigationController 并推送视图控制器而不会看到这种行为。

【问题讨论】:

这是一个错误。这里有一个解决方法:***.com/questions/22710487/… 【参考方案1】:

问题原来是contentSizeForViewInPopover

我们的UINavigationController 子类实现了这个方法来告诉包含UIPopoverController 它应该有多大。在 7 之前的所有 iOS 版本中都记录了绝对有效。它不仅在 7 中被弃用,还会导致上述问题。

解决方案是在 iOS 7 中返回 popoverController.contentViewController.view.bounds.size 并重新执行所有视图,以便它们适合弹出框,而不是调整弹出框的大小来处理您的视图。

另一种解决方案可能是摆脱导航控制器并简单地关闭弹出控制器并以新的尺寸重新显示一个新的控制器。

感谢您的阅读。总有一天我会试着问一个有人可以回答的问题。

【讨论】:

【参考方案2】:

我遇到了完全相同的问题,然后我意识到问题出在键盘隐藏上,所以我在导航控制器推送下一个视图之前辞职了文本字段第一响应者。

【讨论】:

【参考方案3】:

contentSizeForViewInPopover 如 Craig 所述,在 iOS 7 中已弃用。 popoverContentSize UIPopoverController 的属性。该属性表示由 UIPopoverController 的 contentViewController 属性中的视图控制器管理的内容视图的大小。 Reference

【讨论】:

以上是关于UINavigationController pushViewController:animated: 表现出奇怪的动画行为的主要内容,如果未能解决你的问题,请参考以下文章

带有主 UINavigationController 和详细 UINavigationController 的 UISplitViewcontroller

带有 UINavigationController 的 UITabBarController,在 hidesBottomBarWhenPushed 上隐藏 UINavigationController

在 UINavigationController 内的 UITabBarcontroller 中添加 UINavigationController?

UINavigationController 与 AppDelegate 中的 UISegmentedControl 切换 UINavigationController 的 rootviewcontr

从一个 UINavigationController 到另一个 UINavigationController (Swift iOS 9, xcode 7)

UINavigationController