3

異なるサイズのビュー間で回転するように、次のアニメーションを設定しました。新しい背の高いビューが表示されると、アニメーションの中点がちらつくように見えます。移行をスムーズにするためにできることはありますか?

newView.layer.transform = CATransform3DMakeRotation(M_PI_2, 0.0, 1.0, 0.0);

[UIView animateWithDuration:0.5
                          delay:0
                        options:UIViewAnimationOptionCurveLinear
                     animations:^{oldView.layer.transform = CATransform3DMakeRotation(M_PI_2, 0.0, -1.0, 0.0);}
                     completion:^(BOOL finished) {

                         [oldView removeFromSuperview];
                         [UIView animateWithDuration:0.5
                                               delay:0
                                             options:UIViewAnimationOptionCurveLinear
                                          animations:^{newView.layer.transform = CATransform3DMakeRotation(M_PI_2, 0.0, 0.0, 0.0);}
                                          completion:nil];

    }];
4

3 に答える 3

7

このスレッドのおかげでこれが機能するようになったので、m34マトリックスを使用してto-from3D変換を共有したいと思いました。

ここに画像の説明を入力してください

    UIView *toView = // show this
    UIView *fromView = // hide this one

    // set up from
    CATransform3D fromViewRotationPerspectiveTrans = CATransform3DIdentity;
    fromViewRotationPerspectiveTrans.m34 = -0.003; // 3D ish effect
    fromViewRotationPerspectiveTrans = CATransform3DRotate(fromViewRotationPerspectiveTrans, M_PI_2, 0.0f, -1.0f, 0.0f);

    // set up to
    CATransform3D toViewRotationPerspectiveTrans = CATransform3DIdentity;
    toViewRotationPerspectiveTrans.m34 = -0.003;
    toViewRotationPerspectiveTrans = CATransform3DRotate(toViewRotationPerspectiveTrans, M_PI_2, 0.0f, 1.0f, 0.0f);

    toView.layer.transform = toViewRotationPerspectiveTrans;

    [UIView animateWithDuration:1.0
                          delay:0
                        options:UIViewAnimationOptionCurveLinear
                     animations:^{fromView.layer.transform = fromViewRotationPerspectiveTrans; }
                     completion:^(BOOL finished) {

                         [fromView removeFromSuperview];
                         [UIView animateWithDuration:1.0
                                               delay:0
                                             options:UIViewAnimationOptionCurveLinear
                                          animations:^{toView.layer.transform = CATransform3DMakeRotation(M_PI_2, 0.0, 0.0, 0.0);}
                                          completion:nil];

                     }];
于 2014-05-19T02:48:04.890 に答える
1

私は途中でしたが、変換行列のm34セル値を設定する欠落した部分がうまくいきました。

于 2012-10-02T12:25:39.867 に答える
-1

デビッドが指摘したように、あなたのコードは書かれたように意味がありません。newViewの最終的な回転を、何もない周りの回転に設定しています。これは、おそらく単位行列と同等ですが、よくわかりません。

これが私が試みることです(私は疲れているので、これを首尾一貫して説明できるかどうか見てみましょう...)

アニメーションステップ1として、oldViewを0からpi / 2までアニメーション化します。2番目のアニメーションを開始する前に、newViewを-pi / 2に設定します(反対方向に90度回転します)。

完了方法で、古いビューを削除し、アニメーションを開始して、新しいビューの回転をゼロに戻します。これにより、新しいビューは180度反転し続けているように見えます。

ここに注意が必要な部分があります。古いビューと新しいビューのサイズ(水平方向と垂直方向)の違いを計算します。回転とともにスケール変換を追加(連結)して、回転の最初の部分が終了したときに、新旧のサイズの平均にスケーリングされるようにします。擬似コードは次のようになります。

//Scale to apply to oldView for the first part of the animation:
scale height  = ((oldView.size.height+newView.size.height)/2) / oldView.size.height
scale width  = ((oldView.size.width+newView.size.width)/2) / oldView.size.width

/*
Before beginning the second part of the animation, rotate newView to -pi/2, 
and scale it by an amount that makes it the same size that oldView will be 
at the end of the first animation (the average of the sizes of both views)
*/

newView scale height  = ((oldView.size.height+newView.size.height)/2) / 
  newView.size.height
newView scale width  = ((oldView.size.width+newView.size.width)/2) / 
  newView.size.width

完了ブロックで、そのスーパービューからoldViewを削除し、newViewをアニメーション化してIDトランスフォームに戻します。

私のアプローチが正しければ、最初のアニメーションの最後に、oldViewをoldViewとnewViewのサイズの中間のサイズにスケーリングする必要があります。

最初のアニメーションの完了ブロックでトリガーされる2番目のアニメーションは、最初のアニメーションの最後にoldViewがスケーリングされたのと同じサイズのnewViewで始まります。2番目のアニメーションは、新しいビューが所定の位置に回転し、元のサイズに縮小して終了します。

于 2012-09-27T01:55:34.410 に答える