你将如何实现 [UIViewController presentModalViewController]?

Posted

技术标签:

【中文标题】你将如何实现 [UIViewController presentModalViewController]?【英文标题】:How would you implement [UIViewController presentModalViewController]? 【发布时间】:2011-01-14 16:09:06 【问题描述】:

我必须自定义 2 个不同 UIViewController 之间的转换,为此我想重新实现 [UIViewController presentModalViewController...]。这个函数里面是什么?它是如何工作的?它有什么作用?

非常感谢, 万斯

【问题讨论】:

【参考方案1】:

-[UIViewController presentModalViewController:animated:] 在幕后施展魔法。

对于我的应用程序 Tweet Note,我想通过从架子中视图的背面为新视图设置动画来呈现模态视图控制器。 iBooks 或多或少是做什么的。我试图覆盖默认实现,但最终在一个多步骤的解决方案中完成,没有丑陋的黑客和警告:

    实例化新的视图控制器。 将转换应用到新视图控制器的托管视图,使其从初始位置开始。¨ 开始将视图动画化到未转换的“正常”位置。 等待动画完成,然后作为一个整体执行: 从屏幕上删除您刚刚制作动画的视图。 致电[self presentModalViewController:vc animated:NO]

最后一步很重要!在您的过渡动画完成后,模态视图控制器正常呈现,但没有动画,并且会向用户显示,就像您进行了正确的动画演示一样。

使用您的自定义过渡解除或多或少是在做同样的事情,但顺序相反。

【讨论】:

非常酷,但我会称之为 hack。你必须在这里实例化你的视图控制器两次。如果在动画过程中某些关键数据发生了变化,它看起来不会很流畅。 @Moshe:这就是 Apple 自己的 presentModalViewController:animated: 实现的工作原理。您不需要实例化两次,只需将托管视图添加到 windows 视图层次结构两次(但 UIKit 也是如此)。如果新视图控制器的 UI 在转换的时间跨度内大幅更新,您将在布局中获得 跳转。但是这并没有新的问题,这对于 UIKit 提供的内置转换同样适用。

以上是关于你将如何实现 [UIViewController presentModalViewController]?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用自定义 UIViewController 转换来实现这一点?

你将如何在 Java 中实现 LRU 缓存?

如果你的应用需要智能 DNS 服务,你将如何实现?

将 UIViewController 与 UIView 一起使用 - (想改用 UIScrollView) - 如何进行切换

你将如何用语言 x 实现哈希表? [关闭]

如何将 UIViewController/UITabBar 添加到 UITableViewCell?