4

これは以前にも質問されたことがありますが、私が知る限り、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 ドア オープナーに適用する方法がよくわかりません。

3D ドア - ただし軸は中央にある

3D展開

4

1 に答える 1

8

3D を機能させるには、ちょっとしたトリックを適用する必要があります。

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

これにより、透視変換が作成されます。1000 は、ビューアからオブジェクトまでの距離を表します (この値を試して滑らかな外観を得ることができます)。

于 2011-10-07T09:47:58.177 に答える