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

n.e*_*ind 4 iphone animation cocoa-touch catransform3d

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

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

首先要注意的是,您无法使用UINavigationController执行此操作,因为很难覆盖自定义动画.可以在此处找到有关如何设置两个ViewControllers的正确教程:ViewController动画

所以一旦设置完毕,这是我的自定义动画,看起来很糟糕.它看起来好像是在向左挤压书的门/盖.我担心没有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];


}
Run Code Online (Sandbox Code Playgroud)

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

这里有一些帖子,但我真的不知道如何将它们应用到3D开门器:

3D门 - 但轴在中间

3D展开

Mar*_*ich 8

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

CATransform3D _3Dt = CATransform3DIdentity;
_3Dt.m34 = 1.0 / -1000;
Run Code Online (Sandbox Code Playgroud)

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