向 UIViewController 外观添加淡入淡出动画

Adding a fade in animation to UIViewController appearance

当我用这种方法改变UIViewController时,它只是出现而没有任何动画。我想在视图中添加淡入淡出动画,我该怎么做?

- (void)changeToRootViewController:(UIViewController*)viewController forNavigationController:(UINavigationController*)naviController class:(Class)class
{
    if ([[naviController.viewControllers lastObject] isKindOfClass:[class class]])
    {
        NSLog(@"Already inside %@.", NSStringFromClass(class));
        return;
    }

    [naviController popToRootViewControllerAnimated:NO];
    NSMutableArray *viewControllers = [[NSMutableArray alloc] initWithArray:naviController.viewControllers];
    [viewControllers removeObjectAtIndex:0];
    naviController.viewControllers = viewControllers;
    [naviController pushViewController:viewController animated:YES];
}

您应该对导航控制器进行一次更改,而不是两次:

[naviController setViewControllers:@[ viewController ] animated:YES];

这将使用适当的动画将现有的控制器堆栈替换为您的一个控制器。

假设您 class 检查实际上是在寻找相同的实例而不是视图控制器的相同 class 那么您实际上可以用这一行替换所有这个方法。

如果您想在堆栈中保留一些视图控制器,则创建 viewControllers 的可变副本,编辑其内容,然后将该数组设置为带有动画的视图 viewController 数组。

您可以尝试这样的操作:

CATransition* transition = [CATransition animation];
transition.duration = 0.3;
transition.type = kCATransitionFade;
transition.subtype = kCATransitionFromTop;

[self.navigationController.view.layer addAnimation:transition forKey:kCATransition];
[self.navigationController pushViewController:yourViewController animated:NO];