有没有办法在transitionWithView中使用presentViewController动画?

时间:2015-11-09 01:36:11

标签: ios

我在切换根视图控制器时使用transitionWithView来制作动画,但UIViewAnimationOptions参数中包含的动画选项没有像presentViewController动画那样的动画。

有一种简单的方法吗?或者我如何编写与presentViewController动画完全相同的动画?

这是我正在使用的动画:

if (animated) {
    [UIView transitionWithView:self.window duration:0.3
                       options:UIViewAnimationOptionTransitionFlipFromLeft
                    animations:^{
                        weakSelf.window.rootViewController = weakSelf.loginNavigationController;

                    }
                    completion:^(BOOL finished) {

                    }];
}

2 个答案:

答案 0 :(得分:1)

以下是我在其中一个应用中执行类似操作的方式。

在更改根视图控制器时,我不会尝试这样做。相反,我有一个始终存在的根视图控制器。我将其设为自定义父视图控制器。它的子视图控制器看起来像一样,因为它占据了整个窗口。

现在,当我更换子视图控制器时,我调用了transitionFromViewController:toViewController:duration:options:animations:completion:。这样做的好处是我可以编写自己的动画。

正如你所看到的,让动画从底部向上滑动是微不足道的;您可以完全控制视图的动画效果:

enter image description here

答案 1 :(得分:0)

我遵循matt的建议,在代码更改下面做了:

首先在didFinishLaunchingWithOptions

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    ...
    // the container view controller
    self.window.rootViewController = [[UIViewController alloc] init];
    if (!SharedInstance.accessToken) {
        self.loginNavigationController = [self getNewLoginNaivigationController];
        [self.window.rootViewController addChildViewController:self.loginNavigationController];
        [self.window.rootViewController.view addSubview:self.loginNavigationController.view];
        [self.loginNavigationController didMoveToParentViewController:self.window.rootViewController];
    } else {
        self.rootHomeViewController = [self getNewRootHomeController];
        self.AppNavigationController = [self getNewAppNavigationControllerFromRootHomeViewController:self.rootHomeViewController];
        [self.window.rootViewController addChildViewController:self.rootHomeViewController];
        self.AppNavigationController.delegate = nil;
        [self.window.rootViewController.view addSubview:self.rootHomeViewController.view];
        [self.rootHomeViewController didMoveToParentViewController:self.window.rootViewController];
    }
}

然后当我想改变它时:

-(void)displayHomeViewControllerWithAnimation:(BOOL)animated {
    if (!self.rootHomeViewController) {
        self.rootHomeViewController = [self getNewRootHomeController];
        self.AppNavigationController = [self getNewAppNavigationControllerFromRootHomeViewController:self.rootHomeViewController];
        self.AppNavigationController.delegate = nil;
        [self.window.rootViewController addChildViewController:self.rootHomeViewController];
    }

    // animation
    __weak typeof(self) weakSelf = self;

    [self.loginNavigationController willMoveToParentViewController:nil];
    if (animated) {
        [self.window.rootViewController transitionFromViewController:self.loginNavigationController
                                                 toViewController:self.rootHomeViewController duration:0.3
                                                          options:UIViewAnimationOptionCurveLinear animations:^{
                                                              // do animation here                
                                                          } completion:^(BOOL finished) {
                                                              [weakSelf.rootHomeViewController didMoveToParentViewController:weakSelf.window.rootViewController];
                                                              [weakSelf.loginNavigationController removeFromParentViewController];
                                                              weakSelf.loginNavigationController = nil;
                                                          }];
    } else {
        [weakSelf.rootHomeViewController didMoveToParentViewController:weakSelf.window.rootViewController];
        [weakSelf.loginNavigationController removeFromParentViewController];
        weakSelf.loginNavigationController = nil;
    }
}