我在切换根视图控制器时使用transitionWithView
来制作动画,但UIViewAnimationOptions
参数中包含的动画选项没有像presentViewController
动画那样的动画。
有一种简单的方法吗?或者我如何编写与presentViewController
动画完全相同的动画?
这是我正在使用的动画:
if (animated) {
[UIView transitionWithView:self.window duration:0.3
options:UIViewAnimationOptionTransitionFlipFromLeft
animations:^{
weakSelf.window.rootViewController = weakSelf.loginNavigationController;
}
completion:^(BOOL finished) {
}];
}
答案 0 :(得分:1)
以下是我在其中一个应用中执行类似操作的方式。
在更改根视图控制器时,我不会尝试这样做。相反,我有一个始终存在的根视图控制器。我将其设为自定义父视图控制器。它的子视图控制器看起来像一样,因为它占据了整个窗口。
现在,当我更换子视图控制器时,我调用了transitionFromViewController:toViewController:duration:options:animations:completion:
。这样做的好处是我可以编写自己的动画。
正如你所看到的,让动画从底部向上滑动是微不足道的;您可以完全控制视图的动画效果:
答案 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;
}
}