iOS - 创建自定义过渡动画

时间:2015-04-11 22:03:34

标签: ios objective-c uiviewcontroller

我正在尝试创建自定义转换,以查看链接到具有自定义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];
        }];
    }];
}

1 个答案:

答案 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];
                }];
}