正确的方式创建自定义Segue

时间:2014-01-23 14:44:43

标签: ios cocoa-touch animation core-animation

现在,是的,有数百个关于如何执行自定义segues的问题(和答案)。然而,我并没有夸大其词,所有这些答案都是错误的(我见过的都是50多个)!对不起,这可能听起来很苛刻,但事实是,建议的答案中没有一个给出与过渡中建立的苹果相同(正确)的结果(垂直封面等)。

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

  1. Segue开始(在层次结构中添加视图,在destinationVC上调用viewWillAppear,在sourceVC上调用viewWillDisappear并启动动画)。
  2. 动画在整个期间内都会执行
  3. Segue结束(动画结束,将destinationVC设置为当前VC,无论是堆栈还是模态显示。在destinationVC上调用viewDidAppear,在sourceVC上调用viewDidDisappear
  4. 简而言之:调用viewWillAppear/Disappear - > 动画过渡 - > 调用viewDidAppear/Disappear

    使用苹果内置的segues,这是预期的行为,但不知何故,除了我之外没有一个人有这个问题。许多版本甚至首先将目标视图添加为子视图,然后对其进行动画处理,然后再将其删除并调用

    [srcVC presentModalViewController:destVC animated:NO];

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

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

    在我的情况下,我真正想要的是“垂直封面” - 转换(从上到下),其他所有事件都按预期发送(如上所示)。

    所以,我应该忍受各种丑陋的变通方法(在我需要的时候用硬编码的方法做我的“任务”等),或者是否存在一些隐藏的 以可重复使用的方式执行此操作的方式?

    有趣的事情:即使苹果suggest that you do it the "wrong" way,使它看起来像是正确的方式,但与他们自己的方式相比结果不一致...所以我最好的猜测是苹果在引擎盖下这样做,并忘了提供足够的灵活性让客户执行相同的操作(换句话说是一个大缺陷),或者我只是在一次糟糕的旅行中看到一些不存在的问题......

1 个答案:

答案 0 :(得分:2)

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

经过一些关于新功能的随意阅读后,我偶然发现了一种新的方法来在iOS7中引入的ViewControllers之间进行自定义转换,我想这就是“自定义转换”! 阅读herehere,或来自WWDC here的视频。

我刚刚舔了一下我的脚趾,但基本上它是一个新的,更接近系统的转换方式,并允许更好的控制=更好看的过渡。在浏览了the blog I referenced提供的示例(git found here)之后,我可以确认最终,我们能够执行过渡,这些转换在预期的情况下发生的事件表现为一个预期!

由于我只是在阅读它,我还不能给出详尽的解释,但请查看链接:)

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