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)
我认为主要的问题是我真的不知道如何处理CATransform3DTranslate和CATransform3DRotate.
这里有一些帖子,但我真的不知道如何将它们应用到3D开门器:
你必须应用一个小技巧才能让3D工作:
CATransform3D _3Dt = CATransform3DIdentity;
_3Dt.m34 = 1.0 / -1000;
Run Code Online (Sandbox Code Playgroud)
这会创建透视变换.1000表示从观察者到对象的距离(您可以试验此值以获得平滑的外观).