我正在尝试创建自定义转换,以查看链接到具有自定义segues的Container View Controller的控制器。
这是我尝试创建自定义转换。但是,会发生的情况是视图按预期动态上下移动。但视图控制器立即切换。我想要创建的是垂直滑动屏幕的视图,然后容器切换视图控制器,然后它滑回屏幕。
有关如何使用自定义动画实现此动画的任何想法?
- (void)swapFromViewController:(UIViewController *)fromViewController toViewController:(UIViewController *)toViewController
{
toViewController.view.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
[fromViewController willMoveToParentViewController:nil];
[self addChildViewController:toViewController];
[self transitionFromViewController:fromViewController toViewController:toViewController duration:.4 options:UIViewAnimationOptionCurveEaseOut animations:^{
self.view.frame = CGRectMake(0, 560, self.view.frame.size.width, self.view.frame.size.height);
} completion:^(BOOL finished) {
[UIView animateWithDuration:.4 delay:0 options:UIViewAnimationOptionCurveLinear animations:^{
self.view.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
} completion:^(BOOL finished) {
[fromViewController removeFromParentViewController];
[toViewController didMoveToParentViewController:self];
}];
}];
}
答案 0 :(得分:1)
[UIViewController transitionFromViewController:toViewController]
和fromViewController
都已成为接收者的子控制器时, toViewController
才有效。
transitionFromViewController:toViewController:
的文档说明如下:
两个视图控制器的子视图控制器之间的转换。
fromViewController:一个视图控制器,其视图当前在父视图层次结构中可见。
toViewController:一个子视图控制器,其视图当前不在视图层次结构中。
我没有测试它,但我认为这样可行:
- (void)swapFromViewController:(UIViewController *)fromViewController toViewController:(UIViewController *)toViewController
{
CGFloat width = CGRectGetWidth(self.view.frame);
CGFloat height = CGRectGetHeight(self.view.frame);
[fromViewController willMoveToParentViewController:nil];
[self addChildViewController:toViewController];
toViewController.view.frame = CGRectMake(0.0, height, width, height);
[self.view addSubView:toViewController.view];
[UIView transitionWithView:self.view
duration:0.4
options:UIViewAnimationOptionCurveLinear
animations:^{
fromViewController.view.frame = CGRectMake(0.0, height, width, height);
toViewController.view.frame = CGRectMake(0.0, 0.0, width, height);
}
completion:^(BOOL finished) {
[fromViewController removeFromParentViewController];
[fromViewController.view removeFromSuperView];
[toViewController didMoveToParentViewController:self];
}];
}