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

时间:2015-02-23 22:30:39

标签: ios objective-c uiviewcontroller uinavigationcontroller facetime

简短版:

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

问题:

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

undesirable navigation push animation

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

期望效果:

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

desired FaceTime navigation push animation

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

研究

关于这个问题的文献非常薄。我可以找到一些触及它的问题(例如,Segue Push Animation with Clear Background is Flashing on iOS 7Views getting darker when are pushed on navigation controller),但没有解决办法通过再现所需的FaceTime效果来解决问题。

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

思路:

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

  

这必须是三件事之一:

     

(1)他们将左视图屏蔽到右视图的框架。

     

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

     

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

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

1 个答案:

答案 0 :(得分:1)

对于可能感兴趣的任何人,我确实找到了这个问题的答案,因为Apple在clipUnderlapWhileTransitioningUINavigationController类上使用私有标记_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的应用程序,不允许这样做。)