如何在UITabBarController中的不同UIViewControllers之间进行动画过渡?

时间:2011-08-10 08:55:41

标签: animation uitabbarcontroller transition

我有一个UITabBarController,显示4个标签。

我想在用户滑动屏幕切换标签时添加动画UIViewController转换。 ( - (void)tabBarController:(UITabBarController *)theTabBarController didSelectViewController:(UIViewController *)viewController方法只适用于select tab直接)。过渡将是轻松的风格。

我尝试了以下代码,但没有工作。只有UIViewController移动,UIViewController根本没有显示。(我打印了所有UIViewControllers的帧数据,所有这4个UIViewControllers都是{0,0},{320,480})

// Get views. controllerIndex is passed. 
UIViewController *fromVC = [_tabBarController.viewControllers objectAtIndex:startIndex];
UIViewController *toVC = [_tabBarController.viewControllers objectAtIndex:to];

UIView *fromView = fromVC.view;
UIView *toView = toVC.view;

MWLog(@"from view is %@",fromView);

int direct = startIndex - to; 
// calculate move direction.
if (direct < 0) {

    CGRect outFrame = fromView.frame;
    outFrame.origin.x = -320; // expect fromView will move to {-320,0}, out of screen.
    MWLog(@"fromView's frame is %@", NSStringFromCGRect(fromView.frame));

    CGRect inFrame = toView.frame;
    inFrame.origin.x = 0;

    MWLog(@"toView's frame is %@", NSStringFromCGRect(toView.frame));

    [UIView beginAnimations:@"moveView" context:nil];

    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
    [UIView setAnimationDuration:0.5f];

    toView.frame = inFrame;
    fromView.frame = outFrame;
    [UIView commitAnimations];
}else
{
    // reverse moving. ignored....

}

你能告诉我什么是错的以及如何正确地做到这一点?提前谢谢!

1 个答案:

答案 0 :(得分:0)

最后我找到了解决方案。

使用CATransition动画,输入push,根据方向左键或右键(通过计算tabbarcontroller的selectedIndex属性)。然后,将此动画添加到tabbarcontroller的容器视图中。

可以通过枚举[tabbarcontroller subviews]数组中的所有UIView来获取此视图的引用。实际上,如果没有自定义UIView,tabbarcontroller包含2个子视图,一个是UITabBar,另一个是容器视图,UITransitionView。在此视图上添加动画,您可以为不同的内容屏幕启用页面过渡动画。