立方结构视图控制器

时间:2012-03-22 19:54:02

标签: iphone objective-c ios xcode uiview

我希望构建一个具有6个视图控制器的应用程序,这些视图控制器以多维数据集结构布局(而不是有用于导航的标签栏......)。我用这个例子来制作立方体过渡:switch two view controller's view in a cube animation

但是,大多数示例(另一个:how does the CATransition work?)显示了如何在UIViews而不是UIViewControllers之间进行转换,这是我感兴趣的。

我的问题是:我如何使用CATransition在UIViewControllers之间进行转换,以及 - 我如何从一个UIViewController返回到另一个假设我正在使用pushViewController:方法(到目前为止我一直在使用presentModalViewController:并获取back(比方说,取消)使用这个方法dismissModalViewControllerAnimated:)。

感谢。

1 个答案:

答案 0 :(得分:4)

您不能使用CATransition在两个视图控制器之间切换,但您可以简单地使用视图控制器的视图并使用另一个视图控制器的视图进行切换。

iOS 5使用UIViewControllers进行转换更加容易,因为它引入了transitionFromViewController:toViewController:duration:options:animations:completion:方法。

最后,你仍然会使用UIViewControllers的UIViews。

(实际上,你提供的链接正是你在两个UIViewControllers之间转换的方式。请记住,视图控制器只管理视图而不是真正的视图本身。切换回来并不像dismissModalViewControllerAnimated那么容易:但有时候自定义不是'很容易)。

以下是使用iOS 5方法的示例:

UIViewController * controller = [[UIViewController alloc] initWithNibName:nil bundle:nil];     [controller.view setBackgroundColor:[UIColor greenColor]];

[self addChildViewController:controller];

[self transitionFromViewController:self.redController toViewController:controller duration:0.8 options:0 animations:^{
    CATransition *transition = [CATransition animation];
    transition.delegate = self;
    transition.duration = 0.8;
    transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
    NSString *types[4] = {@"cube", @"rippleEffect", @"cube", @"alignedCube"};
    NSString *subtypes[4] = {kCATransitionFromLeft, kCATransitionFromRight, kCATransitionFromTop, kCATransitionFromRight};

    transition.type = types[0];
    transition.subtype = subtypes[1];

    [self.view.layer addAnimation:transition forKey:nil];
} completion:^(BOOL finished) {
    [controller didMoveToParentViewController:self];
}];

注意,您必须事先做好以下事项。

[self addChildViewController:self.redController];
[self.view addSubview:self.redController.view];

使用这些方法之前,您需要做一些事情。主要区别在于您将拥有比当前更多的视图控制器。这个额外的UIViewController作为另外两个的容器(有点像目前的情况,self.view是你拥有的两个UIViews的容器)。