これは以前にも質問されたことがありますが、私が知る限り、stackoverflow にサンプル コードはなく、適切な解決策もありません。私は解決策を持っていますが、それはがらくたに見えます。よりリアルな 3D ドアの開閉/本の表紙のアニメーションを得るための入力と変更に感謝します。
目的は、ドアや本の表紙を開けているかのような効果が得られるように、UIViewController 間にアニメーションを設定することです。ViewController 2 は静的でバックグラウンドにあります。その上に、ViewController 2 を覆う ViewController 1 を配置します。アニメーションは ViewController 1 (ハードカバーの本のようなもの) を開き、ViewController 2 (いわば最初のページ、またはドアの後ろにあるもの) を明らかにします。
最初に注意すべきことは、カスタム アニメーションを上書きするのが難しいため、UINavigationController ではこれを行うことができないということです。2 つの ViewController を設定する方法に関する適切なチュートリアルは、ここにあります: 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];
}
CATransform3DTranslate
主な問題は、 and の処理方法がよくわからないことだと思いますCATransform3DRotate
。
これに関するいくつかの投稿がありますが、それらを 3D ドア オープナーに適用する方法がよくわかりません。