3D门打开两个UIViewControllers之间的动画

时间:2011-10-07 09:44:21

标签: iphone cocoa-touch animation catransform3d

以前曾经问过这个问题,但是就stackoverflow而言,没有找到示例代码,据我所知,没有适当的解决方案。我有一个解决方案,但它看起来很糟糕。我很感激任何输入和修​​改,以获得更逼真的3D门打开/书籍封面动画。

目标是在UIViewControllers之间创建一个动画,这样就可以获得效果,就像打开一扇门或一本书封面一样。 ViewController 2是静态的并且在后台。在它上方放置了ViewController 1,它覆盖了ViewController 2.动画将打开ViewController 1(就像精装书一样)并显示ViewController 2(你的第一页可以说,或门后面的任何东西)。

首先要注意的是,您无法使用UINavigationController执行此操作,因为很难覆盖自定义动画。有关如何设置两个ViewControllers的正确教程,请访问:ViewController Animations

所以一旦设置完毕,这是我的自定义动画,看起来很糟糕。它看起来好像是在向左挤压书的门/盖。我担心没有3D感觉。任何有关如何做到这一点的建议都会受到欢迎:

-(void)openDoorTo:(UIViewController *)aController duration:(float)aDuration {


    [aController viewWillAppear:YES];
    [activeController viewWillDisappear:YES];

    [self.view insertSubview:aController.view belowSubview:activeController.view]; // so that it is below activeController

    [aController viewDidAppear:YES];

    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:aDuration];

    aController.view.transform = CGAffineTransformMakeTranslation(0,0);

    CATransform3D _3Dt = CATransform3DIdentity;
    _3Dt = CATransform3DTranslate(_3Dt, -320, 0, 0);
    _3Dt = CATransform3DRotate(_3Dt, M_PI * 1.5, 0.0, 1, 0.0);
    _3Dt = CATransform3DTranslate(_3Dt, 320, 0, 0);

    activeController.view.layer.transform = _3Dt;

    [UIView commitAnimations];

    [self performSelector:@selector(animationDone:) withObject:aController afterDelay:aDuration];


}

我认为主要问题是我真的不知道如何处理CATransform3DTranslateCATransform3DRotate

以下是这方面的一些帖子,但我无法真正看到如何将它们应用于3D开门器:

3D Door - but Axis in the middle

3D Unfolding

1 个答案:

答案 0 :(得分:8)

你必须应用一个小技巧才能让3D工作:

CATransform3D _3Dt = CATransform3DIdentity;
_3Dt.m34 = 1.0 / -1000;

这会创建透视变换。 1000表示从观察者到物体的距离(您可以试验此值以获得平滑的外观)。