代码之家  ›  专栏  ›  技术社区  ›  Calvin

为UINavigationController的“后退”按钮设置动画

  •  2
  • Calvin  · 技术社区  · 14 年前

    我在导航控制器的继承权中的视图控制器上有一个自定义按钮,按下该按钮时,弹出可见视图控制器。

    我想用UIView的 transform 属性设置视图控制器关闭的动画。它是有效的,但如果我用“popViewControllerA”nimated:YES'时,动画的默认左侧幻灯片仍然存在,尽管我的自定义变换也可以工作。

    如果我设置 popViewControllerAnimated:NO 它根本没有任何动画效果。

    我还研究了使用 CATransition popViewControllerAnimated 设置为 NO

    所以我想我的问题是:

    1) 有没有一种方法可以移除默认过渡中的左幻灯片,但仍然使用自定义动画 转型

    过渡 ?

    1 回复  |  直到 14 年前
        1
  •  6
  •   Ron Srebro    14 年前

    我做了一些类似于您所描述的事情,即在UINavigationController中更改pop和push-of-view的默认动画。

    其思想是禁用对象的默认动画,并将其替换为您自己的动画。我为UINavigationController创建了一个新的类别,并使用了一个类似于下面的函数。

     - (void) altAnimatePopViewControllerAnimated:(BOOL)animated
     {
    [CATransaction begin];
    
    CATransition *transition;
    transition = [CATransition animation];
    transition.type = kCATransitionPush;          // Use any animation type and subtype you like
    transition.subtype = kCATransitionFromTop;
    transition.duration = 0.3;
    
    CATransition *fadeTrans = [CATransition animation];
    fadeTrans.type = kCATransitionFade;
    fadeTrans.duration = 0.3;
    
    
    [CATransaction setValue:(id)kCFBooleanTrue
                     forKey:kCATransactionDisableActions];
    
    [[[[self.view subviews] objectAtIndex:0] layer] addAnimation:transition forKey:nil];
    [[[[self.view subviews] objectAtIndex:1] layer] addAnimation:fadeTrans forKey:nil];
    
    
    
    [self  popViewControllerAnimated:YES];
    [CATransaction commit];
       }
    

       [self.navigationController altAnimatePopViewControllerAnimated:YES];
    

    虽然不完美,但很管用。当您选择不同的动画类型时,请使用组成导航栏/控制器的不同子视图来实现完美的效果。

    我花了不少时间才想出这个,所以明智地使用它:)

    *******编辑

    尝试用以下内容替换推送转换(我自己没有尝试):

      CAKeyframeAnimation *scale = [CAKeyframeAnimation animationWithKeyPath:@"transform.scale"];
      scale.duration = duration;
      scale.values = [NSArray arrayWithObjects:[NSNumber numberWithFloat:.5f],
                  [NSNumber numberWithFloat:1.2f],
                  [NSNumber numberWithFloat:.85f],
                  [NSNumber numberWithFloat:1.f],
                  nil];