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尽管如此。