时间:2010-07-26 05:25:17

标签: iphone objective-c uiview popviewcontroller

1 个答案:

答案 0 :(得分:6)

我做了类似于你描述的事情,即在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];

这会弹出,即视图在大小合适之前会更大。使用数组中的值来控制动画的曲线。