1

精简版:

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

问题:

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

不受欢迎的导航推送动画

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

想要的效果:

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

想要的 FaceTime 导航推送动画

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

研究:

关于这个问题的文献出奇地少。我可以找到一些涉及它的问题(例如,Segue Push Animation with Clear Background is Flashing on iOS 7 and 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) 他们正在运行自定义视图转换。

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

4

1 回答 1

1

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

参见,例如:

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 的应用程序是不允许的)。

于 2015-05-19T22:12:51.857 回答