UINavigationController自定义过渡动画

时间:2010-02-24 09:34:00

标签: iphone uinavigationcontroller

我有一个UINavigationController,它有一个可见的导航栏和工具栏。当按下控制器(同一个控制器)时,我想仅为内容部分设置动画(例如,使用滑动效果),并保持NavigationBar和工具栏不动画/不变。任何人都可以提供任何干净的方式来做这个吗?感谢。

3 个答案:

答案 0 :(得分:1)

我会手动移动视图并使用动画块为它们设置动画:

// Get position of old view controller
CGPoint center = [oldViewController.view center];

// Position new view controller to the right of old one
[newViewController.view setCenter:CGPointMake(center.x + 320, center.y)];

// Animate change
[UIView beginAnimations:@"myAnimation" context:NULL];

// Move old view off screen
[oldViewController.view setCenter:CGPointMake(center.x - 320, center.y)];

// Move new view onto screen
[newViewController.view setCenter:center];

// Set animation delegate to self so that we can detect when animation is complete
[UIView setAnimationDelegate:self];
[UIView setAnimationDidStopSelector:@selector(animationComplete:finished:target:)];

// Finish animation block
[UIView commitAnimations];

如果您需要使用导航控制器实际推送新的视图控制器,您需要确保在动画完成后执行此操作,否则将不会显示旧视图。为此,您需要使用setAnimationDelegate方法来获知动画何时完成并传入要调用的选择器方法。在同一个类中实现上面的代码和以下方法:

(void)animationComplete:(NSString *)animationId 
               finished:(BOOL)finished 
                 target:(UIView *)target
{
  if([animationId isEqualToString:@"myAnimation"])
  {
    // Push viewcontroller here
  }
}

答案 1 :(得分:1)

尝试将工具栏作为子视图添加到窗口而不是视图。并限制navigationcontroller视图高度,以便您可以看到它的工具栏。现在,如果您按下视图控制器,导航栏和工具栏将保持不动画/ stagnent。

答案 2 :(得分:0)

将新UIViewController的navigationItem设置为与当前UIViewController相同。

newViewcontroller.navigationItem = self.navigationItem;
[self.navigationController pushViewController:recallViewController animated:YES];