如何在导航控制器中将过渡动画从底部更改为顶部?

Posted

技术标签:

【中文标题】如何在导航控制器中将过渡动画从底部更改为顶部?【英文标题】:How to change the transition animation from bottom to top in navigation controller? 【发布时间】:2014-03-05 12:51:28 【问题描述】:

我是 ios 新手。我正在尝试使用 Segue 更改导航控制器中的过渡动画以从底部到顶部加载新的 UIView 控制器。我相信实施起来不会太难,但可能我无法理解。

我在其他帖子中找不到任何解决方案。

这是我一直在尝试的代码:-

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
if ([segue.identifier isEqualToString:@"alarmSegue"]) 
    tab2ViewController *destViewController = segue.destinationViewController;
    UIView *destView = destViewController.view;
    destViewController.selectionName = @"alarms";

    [sender setEnabled:NO];
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:1.0];
    [UIView animateWithDuration:0.0
                          delay:0.0
                        options: UIViewAnimationOptionCurveLinear
                     animations:^
                         [destView setTransform:CGAffineTransformMakeTranslation(0, -1000)];
                         //[destView setFrame:CGRectMake(0, 440, 400, 45)];
                         //destView.frame = CGRectMake(0, 0, 320, 460);
                     
                     completion:^(BOOL finished)
                         [sender setEnabled:YES];
                     ];
    [UIView commitAnimations];


     
 

我只想使用 Segue 实现从底部到顶部的简单过渡。我也想设置目标控制器的一些属性。

【问题讨论】:

【参考方案1】:

[UIView beginAnimations:nil context:nil];[UIView commitAnimations]; 之间的代码(也包括这两行)替换为以下内容:

CGAffineTransform baseTransform = destView.transform; //1
destView.transform = CGAffineTransformTranslate(baseT,0,destView.bounds.size.height); //2

[UIView animateWithDuration: 0.5 animations:^ 
    destView.transform = baseTransform; //3
];
    引用原始转换。 在没有动画的情况下将我们的视图向下推,以便我们可以对其进行动画处理 将原始变换设置回视图。这一次,它会动起来

您可以进一步将延迟、选项和完成参数添加到该 UIView 动画方法。 Xcode 可能会帮助您完成这些自动完成。

【讨论】:

【参考方案2】:

嗯,你快到了。

你主要需要改变两件事:

1 改变视图的初始位置。您希望视图从下到上显示,因此最初您的视图应该位于底部。这段代码应该写在动画之前。

[destView setTransform:CGAffineTransformMakeTranslation(0, -1000)];

2 然后你需要从底部滑动到原来的位置,因此在动画块内:

 [destView setTransform:CGAffineTransformMakeTranslation(0, 0)];

还有一个建议,我猜你使用的是更新版本的iOS(iOS4以上)而不是使用动画块使用UIView的动画方法

+ (void)animateWithDuration:(NSTimeInterval)duration delay:(NSTimeInterval)delay options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion

更多信息,请参考description。

编辑: 根据您对问题的编辑,您希望使用情节提要在应用程序中更改 NavigationController 的过渡动画。为此,您可以使用自定义 Segue。你必须创建一个自定义的 segue,一个继承 UIStorySegue 的类并覆盖它的 perform 方法,如下所示:

-(void)perform 
    //UIViewAnimationOptions options;
    UIViewController *sourceViewController = (UIViewController*)[self sourceViewController];
    UIViewController *destinationController = (UIViewController*)[self destinationViewController];

    CATransition* transition = [CATransition animation];
    transition.duration = 0.9f;
    transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
    transition.type = kCATransitionPush; //kCATransitionMoveIn; //, kCATransitionPush, kCATransitionReveal, kCATransitionFade
    transition.subtype = kCATransitionFromTop; //kCATransitionFromLeft, kCATransitionFromRight, kCATransitionFromTop, kCATransitionFromBottom

    [destinationController.view.layer addAnimation:transition forKey:kCATransition];
    [sourceViewController presentViewController:destinationController animated:NO completion:nil];

您还必须在情节提要中将 segue 类更改为此自定义 segue,以使其正常工作。

【讨论】:

是的,我试过 [destView setTransform:CGAffineTransformMakeTranslation(0, 0)];然后第一行第二个参数是-1500。它可以工作,但是在我们的动画中,从右到左的默认动画是可见的。我们能阻止它吗? 动画完成后,没有进行segue,因此没有接收到目标控制器所需的属性。如何使用动画执行 segue? 您在使用导航控制器吗?如果是,那么你问的是一个错误的问题。然后,您应该寻找如何在导航控制器中更改过渡动画。如果您将视图作为子视图添加到另一个视图上,我粘贴的解决方案会更有用 哦对了!那我换个问题吧。既然您已经知道我一直在努力实现的目标,那么您能帮我解决这个问题吗?【参考方案3】:

尝试使用transition effects

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
    if ([segue.identifier isEqualToString:@"alarmSegue"]) 


        CATransition transition = [CATransition animation];
        transition.duration = 0.5;
        transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
        transition.type = kCATransitionPush;
        transition.subtype = direction;
        [self.view.layer addAnimation:transition forKey:kCATransition];

        tab2ViewController *destViewController = segue.destinationViewController;
        UIView *destView = destViewController.view;
        destViewController.selectionName = @"alarms";

        [sender setEnabled:NO];

         
     

【讨论】:

我正在尝试。你能告诉我transition.subtype中的“方向”是什么吗? 把它写成字符串@"left"@"top" 谢谢!我得到了它。但我正在尝试打开一个新视图,该视图将从下到上进行动画处理,一个简单的动画,如默认(从右到左)。 @NirajBurde 不会以类似方式打开新视图 它在离开屏幕时动画当前视图的过渡

以上是关于如何在导航控制器中将过渡动画从底部更改为顶部?的主要内容,如果未能解决你的问题,请参考以下文章

在swift中将navigationBar底部边框更改为虚线

在导航栏中将后退按钮更改为向下箭头

在Android中使用导航组件时如何删除默认动画过渡?

在底部导航栏上推送新屏幕时出现颤振过渡动画问题

如何在php中将面包屑导航栏的颜色从紫色更改为#d6df23

使用喷气背包导航将自定义过渡动画添加到底部导航设置