4

ユーザーが画面の右側から指をドラッグしたときにフリップ アニメーションを実行したい。アニメーションの状態は、ドラッグの長さによって影響を受ける必要があり、自動的に機能するべきではありません。

私はこのようなものを使用しました:

if (transitionBegan) {

    flipTransition = CATransform3DIdentity;
    flipTransition.m34 = 1.0 / -500;
    flipTransition = CATransform3DRotate(flipTransition, degree * M_PI / 180.0f,0.0f, 1.0f, 0.0f);
    self.view.layer.transform = flipTransition;
}

しかし、ビュー A が消えてビュー B が現れるように、ビュー間の遷移を実現する方法がわかりません。

手伝って頂けますか?

4

3 に答える 3

3

を行うジェスチャ認識エンジンを作成できtransformます。たとえば、左右両方を反転できると仮定すると、次のようなことができます。ただし、フリップの半分以下の場合は現在のビューを変換し、半分以上の場合は次のビューを変換するという考え方です。

- (void)handlePan:(UIPanGestureRecognizer *)gesture
{
    static UIView *currentView;
    static UIView *previousView;
    static UIView *nextView;

    if (gesture.state == UIGestureRecognizerStateBegan)
    {
        // Set the three view variables here, based upon the logic of your app.
        // If there is no `previousView` or `nextView`, then set them to `nil`
        // as appropriate.

        // I happen to be choosing views for child view controllers for my 
        // custom container, but I'll spare you that in case you're not using
        // custom container controller.
    }

    // lets set the "percent" rotated as the percent across the screen the user's
    // finger has travelled

    CGPoint translation = [gesture translationInView:gesture.view.superview];
    CGFloat percent = translation.x / gesture.view.frame.size.width;
    CGFloat rotationPercent = percent;

    // let's use the var to keep track of which view will be rotated

    UIView *viewToTransform = nil; 

    if (percent < -0.5 && nextView)
    {
        // if user has moved finger more than half way across the screen to
        // the left, and there is a `nextView`, then we're showing the second
        // half of flip to the next screen

        currentView.hidden = YES;
        nextView.hidden = NO;
        previousView.hidden = YES;
        rotationPercent += 1.0;
        viewToTransform = nextView;
    }
    else if (percent > 0.5 && previousView)
    {
        // if user has moved finger more than half way across the screen to
        // the right, and there is a `previousView`, then we're showing the second
        // half of flip to the previous screen

        currentView.hidden = YES;
        nextView.hidden = YES;
        previousView.hidden = NO;
        rotationPercent -= 1.0;
        viewToTransform = previousView;
    }
    else if ((percent < 0 && nextView) || (percent > 0 && previousView))
    {
        // otherwise we're in the first half of the flip animation, so we're
        // showing the `currentView`

        currentView.hidden = NO;
        nextView.hidden = YES;
        previousView.hidden = YES;
        viewToTransform = currentView;
    }

    // do the flip `transform`

    CATransform3D transform = CATransform3DIdentity;
    transform.m34 = 1.0 / -800;
    viewToTransform.layer.transform = CATransform3DRotate(transform, M_PI * rotationPercent, 0.0, 1.0, 0.0);

    // if we're all done, let's animate the completion (or if we didn't move far enough,
    // the reversal) of the pan gesture

    if (gesture.state == UIGestureRecognizerStateEnded ||
        gesture.state == UIGestureRecognizerStateCancelled ||
        gesture.state == UIGestureRecognizerStateFailed)
    {
        // I'm personally using an index of my custom container child views, so I'm
        // just updating my index appropriately; your logic may obviously differ
        // here.

        if (percent < -0.5 && nextView)
            self.currentChildIndex++;
        else if (percent > 0.5 && previousView)
            self.currentChildIndex--;

        // and animate the completion of the flip animation

        [UIView animateWithDuration:0.25
                              delay:0.0
                            options:UIViewAnimationOptionCurveEaseInOut
                         animations:^{
                             previousView.transform = CGAffineTransformIdentity;
                             currentView.transform = CGAffineTransformIdentity;
                             nextView.transform = CGAffineTransformIdentity;
                         }
                         completion:NULL];
    }
}
于 2013-04-05T22:29:31.387 に答える
2

(指のドラッグをリッスンしているジェスチャー認識エンジン)の助けを借りてそれを行うことができるはずUIPanGestureRecognizerです。パンの長さを取得し、そこからCATransform3D進行状況に応じて に基づく変換とスケーリングを計算できます。パンの。

(組み込みのアニメーションはそこでは役に立ちません。CoreAnimationここで何らかの利用をしなければなりません。楽しいです。私はあなたに言うことができます ;-))

于 2013-04-04T22:16:52.763 に答える
0

メソッドを使用UIView animateWithDuration: animations: completion:して現在のビューを遷移点までアニメーション化し、完了ブロックで現在のビューを削除し、新しいビューを追加して、新しいビューで別の同様のアニメーションを開始します。

于 2013-04-04T21:25:51.743 に答える