如何使用重叠的透明视图控制器重新创建 FaceTime 的导航视图控制器过渡动画?

Posted

技术标签:

【中文标题】如何使用重叠的透明视图控制器重新创建 FaceTime 的导航视图控制器过渡动画?【英文标题】:How to recreate FaceTime's navigation view controller transition animation with overlapping transparent view controllers? 【发布时间】:2015-02-23 22:30:38 【问题描述】:

短版:

我想重现 FaceTime 的导航过渡动画,以将透明视图控制器推送到导航堆栈上,而顶视图的内容不会与底视图的内容重叠。

问题:

在标准UINavigationController 中,推送具有透明背景的目标视图控制器会导致不美观的动画:源视图控制器变暗并平移,然后弹出不存在。这是因为标准的导航推送动画假定目标视图控制器在动画结束时已经完全遮住了源视图控制器,当目标视图控制器的背景是透明的时违反了这一假设。请看这个动画:

我在https://github.com/bgfriend0/PushVCWithClearBackground 上传了一个演示项目,该项目重现了这种行为。

想要的效果:

然而,Apple 的 FaceTime 应用程序似乎能够推送具有清晰背景的视图控制器,同时屏蔽源视图控制器的内容,因此推送动画是干净的。请看这个动画:

我想重现这个 FaceTime 行为,但我没有找到解决方案。

研究:

关于这个问题的文献非常少。我可以找到一些与之相关的问题(例如,Segue Push Animation with Clear Background is Flashing on ios 7 和 Views getting darker when are pushed on navigation controller),但没有解决方案能够通过重现所需的 FaceTime 效果来真正解决问题。

我在一条推文 (https://twitter.com/b3ll/status/384114227884986368) 中找到了 Apple 开发者论坛关于此问题的链接,但同样没有解决方案:https://devforums.apple.com/message/897379#897379。

想法:

我提出的唯一可行的解​​决方案与 Caleb Davenport 在 Apple 论坛帖子中提出的解决方案基本相同:

它必须是以下三件事之一:

(1) 他们将左视图遮盖到右视图的框架。

(2) 他们将背景内容复制到右视图中,同时将其偏移以使右视图不是真正透明的。

(3) 他们正在运行自定义视图转换。

每一个都有一定程度的优点,但它们都非常复杂,我不禁希望应该有一些方便的小标志,比如 Apple 正在利用它来产生所需的蒙版效果。当然,即使存在这样的标志,它也可能是私有 API ......不过,我发布这个问题是为了看看是否有人想出或可以想出一个优雅的解决方案来重现所需的 FaceTime 透明推送动画。

【问题讨论】:

您好,您找到解决方案了吗?我有同样的问题:) @samir 见下面的答案 【参考方案1】:

对于任何可能感兴趣的人,我确实找到了这个问题的答案,因为 Apple 在 UINavigationController_UINavigationParallaxTransition 类上使用了私有标志 clipUnderlapWhileTransitioning

参见,例如:

https://github.com/JaviSoto/iOS8-Runtime-Headers/blob/master/Frameworks/UIKit.framework/UINavigationController.h

https://github.com/JaviSoto/iOS8-Runtime-Headers/blob/master/Frameworks/UIKit.framework/_UINavigationParallaxTransition.h

有了这个标志,我能够完全重现 Facetime 效果。

当然,所有关于使用私有 API 的常见警告都适用于这种情况(即,您打算提交到 App Store 的应用不允许这样做)。

【讨论】:

iOS 11 的任何更新?想要做的事情似乎很常见,但如果没有疯狂的黑客攻击,就很难实现。

以上是关于如何使用重叠的透明视图控制器重新创建 FaceTime 的导航视图控制器过渡动画?的主要内容,如果未能解决你的问题,请参考以下文章

使用透明度:透明视图后面的视图应该只透过而不是重叠

在 Android 应用程序中,如何使用透明文本制作线性视图,以便父视图可见?

如何创建类似 IMDB 应用的 UIView

如何防止子视图重叠标签栏?

c#2个 picturebox控件重叠如何实现透明

如何创建半透明模式 UIViewController?