用动画替换segue?

时间:2013-08-07 16:08:18

标签: ios core-animation uistoryboardsegue

我的一位同事刚刚向我展示了我可以用于我的拆分视图控制器的“替换segue”。它运作良好。

但我真的很想从旧视角到新视角进行“交叉淡入淡出”。我已经通过设置视图的alpha属性来淡化,但不确定这将如何使用segues。

3 个答案:

答案 0 :(得分:1)

问题是过渡动画需要容器视图,但是当替换拆分的细节时,没有合适的容器视图,整个右侧都会被替换(通常是使用包含细节的新导航控制器)。拆分视图具有一个视图,该视图将两个侧面添加为子视图,如果每个侧面都有一个容器视图,那么这将很容易。或者,您可以使用其视图甚至窗口,但随后需要平移框架。解决方法是先快照先前的细节控制器,然后再将其消失,然后将其添加为新细节控制器的子视图,并对其进行动画处理。这是Notes为实现垃圾便笺动画而要做的事情,新的便笺出现在后面(尽管它不使用segues)。如果您希望同一动画以纵向方式工作(例如乱写音符),则由于最好使用嵌套导航控制器,因此最好将最外面的导航控制器的视图用作动画的容器,这样即使是导航栏也包含在淡入淡出中

好消息是,这一切都可以在UIStoryboardSegue子类中完成。在prepareForSegue中,尚未设置self.detailViewController。在调用super之前的perform方法中,使用sourceViewController.detailViewController对视图进行快照。然后调用超级表演。不是,您可以使用目的地更新该属性(以便下次使用它)。然后将此快照添加为目标(或其导航控制器)的子视图。 CATransaction flush然后执行您的transitionWithView,以[snapshot removeFromSuperView]动画化屏幕截图。这是一些示例代码:

'\0'

使用私有方法的道歉,我讨厌必须重新实现缺少的关键公共方法。仅供参考,折叠控制器是我的“拆分视图委托”控制器对象。您也许可以只使用源控制器上的detailViewController属性。

这是画像中的样子:

enter image description here

答案 1 :(得分:0)

试试这个:

  1. 在故事板
  2. 中选择您的segue
  3. 在“属性”检查器中,将“segue”的“样式”设置为“模态”。
  4. 将过渡设置为'Cross Dissolve'
  5. 尝试一下,看看你是否正在寻找。

答案 2 :(得分:0)

在属性检查器中将目标视图的大小更改为“详细信息”大小。使用具有交叉溶解动画的模态segue,将segue表示大小设置为“当前上下文”。

这应该让detailView交叉溶解并让masterView不受影响。

修改

好吧,我已经尝试了几种选择,但我现在的时间已经结束了。我想当我回来的时候你可能已经找到了答案,但这是我得到的最接近的答案。

创建一个淡出DetailViewController的方法,如下所示:

- (void)fadeOut
{
    if (self.view.alpha > 0.0)
    {
        self.view.alpha = self.view.alpha - 0.01;
        [self performSelector:@selector(fadeOut) withObject:nil afterDelay:0.005];
    }
}

然后在使用Replace segue之前调用fadeOut方法。在新的ViewController中,当使用:

替换segue时,可以淡入它
- (void)fadeIn
{
    if (self.view.alpha > 0.0)
    {
        self.view.alpha = self.view.alpha + 0.01;
        [self performSelector:@selector(fadeIn) withObject:nil afterDelay:0.005];
    }
}

你将不得不玩时间,它可能看起来很奇怪(邋and和诸如此类),我还没有测试出完整的概念。

以上是一些hackery,可能不是最好的解决方法,但这就是我到目前为止所做的。如果您还没有弄清楚,我会看到我还能做些什么并进行相应的编辑。