animation - iPhone - UINavigationController - 使用 CATransaction 自定义动画

标签 animation uinavigationcontroller catransition

我正在尝试为 UINavigationController 创建一个类别,以便我可以将一些自定义动画放在一起。我遇到了this question这让我开始了。我提出了以下推送功能:

- (void)pushViewControllerMoveInFromBottom:(UIViewController *)viewController {
    [CATransaction begin];
    CATransition *transition;
    transition = [CATransition animation];
    transition.type = kCATransitionMoveIn;
    transition.subtype = kCATransitionFromBottom;
    transition.duration = 0.7;

    [CATransaction setValue:(id)kCFBooleanTrue
                     forKey:kCATransactionDisableActions];

    [[[[self.view subviews] objectAtIndex:0] layer] addAnimation:transition forKey:nil];
    [self  pushViewController:viewController animated:YES];
    [CATransaction commit];
}

我不明白通过 subview 调用访问哪个 View /层。因此,如果有人能帮助我理解这一点,那将会很有帮助。它似乎会影响即将出现在屏幕上的任何 View 。

但是我的主要问题是我正在尝试创建一个弹出窗口来“撤消”上述功能。为了清楚起见,假设我有两个 View ,A 和 B。A 是屏幕上显示的第一个 View 。上面的函数将移入 B 而不将 A 推出。很像模态视图。但下面的函数将 A 滑回 B 上方,而不是将 B 向上滑动并将 A 留在原处。

- (void)popViewControllerMoveInFromTop {
    [CATransaction begin];
    CATransition *transition;
    transition = [CATransition animation];
    transition.type = kCATransitionMoveIn;
    transition.subtype = kCATransitionFromTop;
    transition.duration = 0.7;

    [CATransaction setValue:(id)kCFBooleanTrue
                     forKey:kCATransactionDisableActions];

    [[[[self.view subviews] objectAtIndex:0] layer] addAnimation:transition forKey:nil];
    [self  popViewControllerAnimated:YES];    
    [CATransaction commit];
}

我不想使用模态视图,也不想使用自定义动画 block 来更改 View 的框架。

最佳答案

我已经完成了类似的事情,尽管我没有费心将它移到它自己的函数中:

CATransition *transition = [CATransition animation];
transition.duration = 0.5;
transition.type = kCATransitionMoveIn;
transition.subtype = kCATransitionFromBottom;
[self.navigationController.view.layer addAnimation:transition forKey:nil];

[self.navigationController popViewControllerAnimated:NO]

你可以把它抽象出来。使用您的代码,它看起来像:

- (void)popViewControllerMoveInFromTop {
[CATransaction begin];
CATransition *transition;
transition = [CATransition animation];
transition.type = kCATransitionMoveIn;
transition.subtype = kCATransitionFromTop;
transition.duration = 0.7;

[CATransaction setValue:(id)kCFBooleanTrue
                 forKey:kCATransactionDisableActions];

[self.view.layer addAnimation:transition forKey:nil];
[self  popViewControllerAnimated:NO];    
[CATransaction commit];
}

您还可以使用 UIView 的动画为弹出窗口创建自定义过渡。在这里,您将动画应用于即将消失的 View ,然后将其从 View 堆栈中弹出:

[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.75];
[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:self.navigationController.view cache:NO]; 

[self.navigationController popViewControllerAnimated:NO];

[UIView commitAnimations];

关于animation - iPhone - UINavigationController - 使用 CATransaction 自定义动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4044181/

相关文章:

ios - Swift Zoom Transition Animation 仅在第二次不起作用

java - Android:加载 fragment 时启动动画

iphone - 如何给 UINavigationController 添加阴影

ios - UITableView和UINavigationController中的内存管理

ios - 使用 CATransition 的自定义 Segue 不工作

css - react-spring 和 framer-motion 在 firefox 上延迟

javascript - 如何扩展背景图像以填满整个页面?

ios - 在 rootView Swift 3.0 之后以编程方式在 ViewControllers 添加栏按钮项

swift - 在 Swift 中创建滑动转场

cocoa - CATransition 替换 subview :with…is animating all views