创build自定义Segue的正确方法

现在,是的,有数百个关于如何执行自定义赛段的问题(和答案)。 然而,我并不夸张,所有这些答案都是错误的(所有50+我见过)! 对不起,这可能听起来很刺耳,但事实是,没有任何build议的答案给出了与转换中build立的苹果(垂直覆盖等)相同(正确)的结果。

更具体地说,这是预期的结果(通过日志确认):

  1. Segue开始(增加层次结构的视图,在sourceVC上调用viewWillAppear ,在sourceVC上调用viewWillAppear并启动animation)。
  2. animation是在整个过程中执行的
  3. Segue结束(animation完成,将目标VC设置为当前VC,无论是在堆栈中还是模态呈现。在sourceVC上调用viewDidAppear ,在sourceVC上viewDidDisappear

总之: 调用viewWillAppear/Disappear – >animation转换– >调用viewDidAppear/Disappear

使用苹果内置的赛段,这是预期的行为,但不知何故,除了我以外没有一个灵魂有这个问题。 许多版本甚至将目标视图作为子视图添加,然后再将其移除并调用

[srcVC presentModalViewController:destVC animated:NO];

要么

[srcVC.navigationController pushViewController:destVC animated:NO];

导致视图事件以各种随机顺序发送(与CoreAnimations相同的问题)。

在我的情况下,我真正想要的是“垂直覆盖” – 转换恢复(从上到下),所有其他事件发送如预期一样(如上所示)。

那么,我是否应该忍受各种丑陋的解决方法(在我需要的硬编码方法中执行我的“任务”等等),还是有一些以可重用的方式隐藏的正确方法?

有趣的事情:即使苹果build议你这样做“错误”的方式 ,使得它看起来像正确的方式,但与他们自己的方式相比,不一致的结果…所以我最好的猜测是,苹果在引擎盖下做这个,忘了给足够的灵活性,以执行相同的操作(换句话说,大缺陷)的客户端,或者我只是在一些不好的旅行,看到一些不存在的问题…

好吧,这可能不是一个真正的答案,如何解决它的自定义赛格(UIStoryboardSegue子类),但它确实解决了一般问题!

在经过了一些关于新function的随意阅读之后,我偶然发现了一种在iOS7中引入的ViewController之间进行自定义转换的新方法,我称之为“自定义转换”。 在这里和这里阅读关于它,或者WWDC的video。

我刚刚蘸了我的脚趾,但基本上它是一个新的,更接近系统转换的方式,并允许更好的控制=更好看的过渡。 看过我引用的博客 (git在这里find)提供的示例后,我可以确认,最后,我们能够做到过渡,performance为一个预期他们在事件发生在预期的场合!

由于我只是阅读它,我不能给一个彻底的解释,但检查出的链接:)

注意:这可能不应该完全取代自定义的segues,但可以用类似的方式(检查示例),所以如果你需要一点额外的花式过渡,这绝对是它的外观的方式! 基本上,你在故事板上设置了连接,并在prepareForSegue:方法中连接正确的转换代表。