dismissModalViewController with transition:从左到右

jcd*_*dmb 17 iphone animation catransition uiviewanimationtransition

我使用一个很好的方法来解雇我的模态视图控制器:

[self dismissModalViewControllerWithTransition:2];
Run Code Online (Sandbox Code Playgroud)

这使得幻灯片从左向右过渡,就像导航控制器弹出视图一样.

由于此方法是非公开方法,因此Apple不会接受它.如何在我的代码中编程这种动画(从左到右滑动,关闭模态视图,从右到左滑动以呈现模态视图)?

提前致谢

jcd*_*dmb 42

我接受了Safecase的答案,但我想在这里发布我的最终解决方案:

1)为了呈现一个从右到左过渡的模态视图控制器,我写了以下方法:

-(void) presentModalView:(UIViewController *)controller {
    CATransition *transition = [CATransition animation];
    transition.duration = 0.35;
    transition.timingFunction =
    [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
    transition.type = kCATransitionMoveIn;
    transition.subtype = kCATransitionFromRight;

    // NSLog(@"%s: self.view.window=%@", _func_, self.view.window);
    UIView *containerView = self.view.window;
    [containerView.layer addAnimation:transition forKey:nil];
    [self presentModalViewController:controller animated:NO];
}
Run Code Online (Sandbox Code Playgroud)

2)使用从左到右的幻灯片转换关闭模态视图:

-(void) dismissMe {
    CATransition *transition = [CATransition animation];
    transition.duration = 0.35;
    transition.timingFunction =
    [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
    transition.type = kCATransitionMoveIn;
    transition.subtype = kCATransitionFromLeft;

    // NSLog(@"%s: controller.view.window=%@", _func_, controller.view.window);
    UIView *containerView = self.view.window;
    [containerView.layer addAnimation:transition forKey:nil];

    [self dismissModalViewControllerAnimated:NO];
}
Run Code Online (Sandbox Code Playgroud)

多谢你们!

  • 要更密切地复制从导航控制器弹出项目的行为,请设置transition.type = kCATransitionReveal. (3认同)

Par*_*iya 7

试试这个:

我假设您从视图控制器1中解除视图控制器2.在视图控制器2中,您正在使用它

[self  dismissModalViewControlleAnimated: NO]];
Run Code Online (Sandbox Code Playgroud)

现在在第一个视图控制器中,在viewWillAppear:方法中添加代码

CATransition *animation = [CATransition animation];

[animation setDelegate:self];
[animation setType:kCATransitionPush];
[animation setSubtype:kCATransitionFromLeft];

[animation setDuration:0.50];
[animation setTimingFunction:
 [CAMediaTimingFunction functionWithName:
  kCAMediaTimingFunctionEaseInEaseOut]];


[self.view.layer addAnimation:animation forKey:kCATransition];
Run Code Online (Sandbox Code Playgroud)