以前曾经问过这个问题,但是就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];
}
我认为主要问题是我真的不知道如何处理CATransform3DTranslate
和CATransform3DRotate
。
以下是这方面的一些帖子,但我无法真正看到如何将它们应用于3D开门器:
答案 0 :(得分:8)
你必须应用一个小技巧才能让3D工作:
CATransform3D _3Dt = CATransform3DIdentity;
_3Dt.m34 = 1.0 / -1000;
这会创建透视变换。 1000表示从观察者到物体的距离(您可以试验此值以获得平滑的外观)。