Objective c 使用transitionFromView自定义segue动画时,视图将显示两次调用

Objective c 使用transitionFromView自定义segue动画时,视图将显示两次调用,objective-c,ios,ios6,segue,uistoryboardsegue,Objective C,Ios,Ios6,Segue,Uistoryboardsegue,我希望执行一个序列,用另一个使用卷曲动画的视图控制器替换窗口的根视图控制器。 我的想法是,在使用卷曲动画将(performsguewithidentifier:)转换到下一个LoginViewController)之前,我将一个SplashViewController显示几秒钟 我创建了一个名为AnimatedSegue的自定义UIStoryboardSegue类。以下是被覆盖的perform方法的代码: - (void)perform { UIViewController *source

我希望执行一个序列,用另一个使用卷曲动画的视图控制器替换窗口的根视图控制器。 我的想法是,在使用卷曲动画将(
performsguewithidentifier:
)转换到下一个
LoginViewController
)之前,我将一个
SplashViewController
显示几秒钟

我创建了一个名为
AnimatedSegue
的自定义
UIStoryboardSegue
类。以下是被覆盖的
perform
方法的代码:

- (void)perform
{
  UIViewController *source = self.sourceViewController;
  UIViewController *destination = self.destinationViewController;

  UIWindow *window = source.view.window;

  [UIView transitionFromView:source.view
                      toView:destination.view
                    duration:1.0
                     options:UIViewAnimationOptionTransitionCurlUp
                  completion:^(BOOL finished) {
                    [window setRootViewController:destination];
                  }];
}
除了在iOS 6中(显然不是在iOS 5中)会出现
视图外,它工作正常:
方法在
目标
视图控制器上被调用了两次。 似乎在转换期间第一次调用它,在执行
[window setRootViewController:destination]时第二次调用它

请注意,我不想使用导航控制器。转换完成后,
SplashViewController
将解除分配(如预期的那样)


关于如何解决我的问题有什么想法吗?

我可能会以不同的方式来解决这个问题,使用两个视图和一个控制器,而不是使用两个带有自定义序列的控制器。在故事板中,只需为控制器添加一个空白视图,并添加两个具有初始视图和主视图的xib文件(视图类型)。启动视图将添加为viewDidLoad中控制器视图的子视图,然后使用与您相同的方法关闭:

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.splashView = [[NSBundle mainBundle] loadNibNamed:@"SplashView" owner:self options:nil].lastObject;
    [self.view addSubview:self.splashView];
    [self performSelector:@selector(removeSplash) withObject:nil afterDelay:2];
}

-(void)removeSplash {
    self.mainView = [[NSBundle mainBundle] loadNibNamed:@"MainView" owner:self options:nil].lastObject;
    [UIView transitionFromView: self.splashView toView:self.mainView duration:.6 options:UIViewAnimationOptionTransitionCurlUp
                    completion:nil];
}

回答我自己的问题以防对其他人有帮助

我最终使用的类来创建segue的动画,而不是
UIView
的动画方法

下面是我的新
执行
方法的样子:

- (void)perform
{
  UIViewController *source = self.sourceViewController;
  UIWindow *window = source.view.window;

  CATransition *transition = [CATransition animation];
  [transition setDuration:1.0];
  [transition setDelegate:self];
  [transition setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]];
  [transition setType:@"pageCurl"];
  [transition setSubtype:kCATransitionFromBottom];

  [window.layer addAnimation:transition forKey:kCATransition];
  [window setRootViewController:self.destinationViewController];
}

如果您真的非常想使用
transitionFromView:
我能找到的唯一有效方法就是创建源代码视图控制器的屏幕快照,并设置动画

- (void)perform
{
    UIViewController *source = self.sourceViewController;
    UIViewController *destination = self.destinationViewController;

    // Create screenshot for animation
    UIGraphicsBeginImageContextWithOptions(source.view.bounds.size, NO, 0.0);
    CGContextRef context = UIGraphicsGetCurrentContext();
    [source.view.layer renderInContext:context];
    UIImageView *screenShot = [[UIImageView alloc] initWithImage:UIGraphicsGetImageFromCurrentImageContext()];
    UIGraphicsEndImageContext();

    // Put destination view controller and screen shot in place
    UIWindow *window = source.view.window;
    window.rootViewController = destination;
    [window addSubview:screenShot];

    [UIView transitionFromView:screenShot
                        toView:destination.view
                      duration:1.0
                       options:UIViewAnimationOptionTransitionCurlUp
                    completion:^(BOOL finished) {
                    }];
}

视图将出现:
并且它的同类只按预期被调用一次

感谢@rdelmar,这是一个很好的选择,但我希望有一个更通用的解决方案,我可以轻松地重用它来制作任何类型的自定义segue动画。我正在考虑使用核心动画,一旦我完成了,我会在这里发布一个解决方案+1尽管如此。