1

考虑到网上有很多教程可以帮助您了解如何使用自定义UIStoryboardSegue在视图控制器之间进行自定义动画过渡,我想知道是否存在“正确“做到这一点的方法。正确的自定义过渡自定义转换方式 - 无边框效果

我要指出,我在看如何做到这一点模态,不与导航控制器。

我意识到有很多新方法是专门为iOS 7中视图控制器之间的转换设置动画而设计的,但如果我需要定位iOS 6呢?或者如果在iOS 7中有这样一个缺点(其中有,请参阅我的SO问题here),那么使用自定义搜索方法就可以轻松解决这个问题。

的问题是,大部分的教程去是这样的:

在您的自定义SEGUE执行方法,你会先添加一个视图控制器的视图到另一个,然后再执行任何你想要的自定义动画。那么动画完成后,你会调用这个方法(如提交或解聘模态)

[sourceViewController presentViewController:destinationViewController animated:NO completion:NULL] 

的问题是,在viewWillAppear中:和viewDidAppear:被称为两次,viewWillDisappear等被调用一次,范围内的所有过渡动画。这不是期望的行为。

有没有一种合适的方式,这是可以实现的?有关此问题的进一步讨论,请参阅Phil Beauvoir在其博客上发布的tutorial,并向下滚动至评论。

此外,我发现有人问了几乎相同的确切问题,但是我仍然问我的问题,因为我的研究发现有几个方面没有在他的question中解决。另外,对他的问题给出的答案并没有解决这个问题,而是提供了另一种方法,即iOS 7方法不适合我的特殊需求。

+0

这个问题是一种广泛和非特定的。我不知道有一种“适当的方式”来进行转换,您是否正在尝试完成特定的转换?你试图避免仅仅是视图外观回调的不正确数量(和时间?),还是有更多的副作用? – rdelmar

+0

@rdelmar没有不敬意,但这个问题既不宽泛,也不具体。如果你仔细阅读这个问题并查看链接,你会看到所有建议的自定义动画方式(动画本身无关紧要 - 只知道它是自定义的),你会发现它们有缺陷并且有副作用。我相信菲尔波伏瓦的教程是关于这个主题的更简单而全面的内容之一,通过跟随它并测试他的样本,你可以看到有不需要的副作用。所以,再一次,有没有一种合适的方式? – daveMac

+0

@rdelmar是的,副作用是视图外观回调被称为不正确的次数(有些人被称为真的不应该 - 我看着你viewWillDisappear :)这些可以解决,但自定义赛格的执行方式显然存在问题。苹果自己的赛格不会导致这些副作用。 – daveMac

回答

1

我不认为有这样做的理想方式。正如您对其他问题的评论之一中提到的那样,苹果公司并没有给我们访问我们需要的所有东西来复制他们的模式转换。具体来说,presentationViewController和presentedViewController属性是只读的,所以我们不能设置它们。过多的视图回调调用的麻烦是对presentViewController的调用:animated:completion:在转换的完成块中,因此消除该调用可以解决大部分特定问题。

我可以来复制苹果的模式转变最近的(但是从上图)是不喜欢这样:

#import "CoverVerticalDown.h" 
#import "ViewController.h" 
#import "BlueViewController.h" 

@implementation CoverVerticalDown 

-(void)perform { 
    ViewController *s = self.sourceViewController; 
    BlueViewController *d = self.destinationViewController; 
    [s.view.window addSubview: d.view]; 
    d.view.frame = CGRectMake(0, -480, 320, 480); 
    [UIView animateWithDuration:.5 animations:^{ 
     d.view.frame = CGRectMake(0, 0, 320, 480); 
    } completion:^(BOOL finished) { 
     NSLog(@"Starting completion block of transition"); 
     [s.view removeFromSuperview]; 
     s.rdPresentedViewController = d; 
     d.rdPresentingViewcontroller = s; 
    }]; 
} 

这不会离开的最终状态相同的模式过渡 - 这是,窗口只有一个视图(新视图),窗口的rootViewController仍然是源视图控制器,并且没有子视图控制器。但正如你所看到的,为了做到这一点,segue需要(通过导入)“了解”源控制器类和目标控制器类,因此我可以设置它们的自定义rdPresentedViewController和rdPresentingViewController属性。至少需要设置第一个需要设置的控制器(这可以在prepareForSegue中完成,我猜虽然这样,也许你不必在segue代码中有这个)。标准模态的回调序列有一个区别 - 源控制器的viewWillDisappear方法直到完成模块才被调用,而在正常模态的过渡期间调用它。这种方法也不考虑旋转,所以如果旋转设备然后进行转换,它将从侧面进入。要解决这个问题,你必须自己做旋转转换。

+0

我认为还有另一个时间问题 - 目标控制器的viewWillAppear和viewDidAppear方法在转换过程中都被调用。所以,这些回调的数量是正确的,并且它们的顺序是正确的(我认为),但是时间点还是有点偏离。 – rdelmar

+0

因此,暂时扮演恶魔的拥护者,除了这是一个拙劣的解决方法,而且你必须小心你在vc的外观方法中执行的代码,还有什么其他潜在的问题如果你刚刚使用了Phil编写的我已经链接到我的问题中的教程,你会遇到什么情况? – daveMac

+0

@daveMac,我不确定,因为我没有尝试过他的代码,但我认为你的主要问题是多余的回调,该方法无法修复,是正确的?你真的需要什么样的行为?您可以更改我上面的代码,将目标控制器添加为子视图控制器,该子控制器设置了childViewController和parentViewController属性,您可以使用它们来代替呈现的和呈现控件属性(并保留子项)。您也可以将子视图添加到源代码,而不是窗口,该窗口会为您提供正确的旋转行为(但不会视图消失)。 – rdelmar