0

で3Dアニメーションを作ってみた

- (void)transitionFromViewController:(UIViewController *)fromViewController toViewController:(UIViewController *)toViewController duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion;

UINavigationController "PushViewController" で 3D アニメーションを作成する 3D アニメーション Happen Throw

- (void) pushViewController:(UIViewController *)viewController animated:(BOOL)animated transitionDirecton:(CubeNavigationAnimationDirection)direction{

    UIViewController *current = self.visibleViewController;

    viewController.view.frame = current.view.frame;

    CGFloat halfWidth = current.view.bounds.size.width / 2.0;
    CGFloat duration = 0.7;
    CGFloat perspective = -1.0/1000.0;

    UIView *superView = current.view.superview;
    CATransformLayer *transformLayer = [[CATransformLayer alloc] init];
    transformLayer.frame = current.view.layer.bounds;

    [current.view removeFromSuperview];
    [transformLayer addSublayer:current.view.layer];
    [transformLayer addSublayer:viewController.view.layer];
    [superView.layer addSublayer:transformLayer];

    // let's be safe about setting stuff on view's we don't control
    UIColor *originalBackgroundColor = superView.backgroundColor;
    superView.backgroundColor = [UIColor blackColor];

    [CATransaction begin];
    [CATransaction setDisableActions:YES];
    CATransform3D transform = CATransform3DIdentity;



    if (animated) {
        if (direction == CubeNavigationAnimationOutside) {
            transform = CATransform3DTranslate(transform, 0, 0, -halfWidth);
            transform = CATransform3DRotate(transform,-M_PI_2, 0, 1, 0);
            transform = CATransform3DTranslate(transform, 0, 0, halfWidth);
        }
        else{
            transform = CATransform3DTranslate(transform, 0, 0, halfWidth);
            transform = CATransform3DRotate(transform, M_PI_2, 0, 1, 0);
            transform = CATransform3DTranslate(transform, 0, 0, -halfWidth);
        }
    }

    viewController.view.layer.transform = transform;
    [CATransaction commit];

    [CATransaction begin];
    [CATransaction setCompletionBlock:^(void) {
        [viewController.view.layer removeFromSuperlayer];
        viewController.view.layer.transform = CATransform3DIdentity;
        [current.view.layer removeFromSuperlayer];
        superView.backgroundColor = originalBackgroundColor;
        [superView addSubview:current.view];
        [transformLayer removeFromSuperlayer];
        [self pushViewController:viewController animated:NO];
        self.view.userInteractionEnabled = YES;
    }];

    CABasicAnimation *transformAnimation = [CABasicAnimation animationWithKeyPath:@"transform"];

    transform = CATransform3DIdentity;
    transform.m34 = perspective;
    transformAnimation.fromValue = [NSValue valueWithCATransform3D:transform];

    transform = CATransform3DIdentity;
    transform.m34 = perspective;

    if (animated) {
        if (direction == CubeNavigationAnimationOutside) {
            transform = CATransform3DTranslate(transform, 0, 0, -halfWidth);
            transform = CATransform3DRotate(transform, M_PI_2, 0, 1, 0);
            transform = CATransform3DTranslate(transform, 0, 0, halfWidth);
        }
        else{
            transform = CATransform3DTranslate(transform, 0, 0, halfWidth);
            transform = CATransform3DRotate(transform,-M_PI_2, 0, 1, 0);
            transform = CATransform3DTranslate(transform, 0, 0, -halfWidth);
        }
    }



    transformAnimation.toValue = [NSValue valueWithCATransform3D:transform];

    transformAnimation.duration = duration;

    [transformLayer addAnimation:transformAnimation forKey:@"rotate"];
    transformLayer.transform = transform;

    [CATransaction commit];

}

transitionFromViewController でこのコードを再利用しようとすると

[self transitionFromViewController:fromViewController
                      toViewController:toViewController
                              duration:3.0
                               options:UIViewAnimationOptionTransitionNone
                            animations:^{
                                toViewController.view.frame = fromViewController.view.frame;

                                CGFloat halfWidth = fromViewController.view.bounds.size.width / 2.0;
                                CGFloat duration = 0.7;
                                CGFloat perspective = -1.0/1000.0;

                                UIView *superView = fromViewController.view.superview;
                                CATransformLayer *transformLayer = [[CATransformLayer alloc] init];
                                transformLayer.frame = fromViewController.view.layer.bounds;

                                [fromViewController.view removeFromSuperview];
                                [transformLayer addSublayer:fromViewController.view.layer];
                                [transformLayer addSublayer:toViewController.view.layer];
                                [superView.layer addSublayer:transformLayer];

                                // let's be safe about setting stuff on view's we don't control
                                UIColor *originalBackgroundColor = superView.backgroundColor;
                                superView.backgroundColor = [UIColor blackColor];

                                [CATransaction begin];
                                [CATransaction setDisableActions:YES];
                                CATransform3D transform = CATransform3DIdentity;




                                    if (direction == CubeTransitionDirectionFromRight) {
                                        transform = CATransform3DTranslate(transform, 0, 0, -halfWidth);
                                        transform = CATransform3DRotate(transform,-M_PI_2, 0, 1, 0);
                                        transform = CATransform3DTranslate(transform, 0, 0, halfWidth);
                                    }
                                    else{
                                        transform = CATransform3DTranslate(transform, 0, 0, halfWidth);
                                        transform = CATransform3DRotate(transform, M_PI_2, 0, 1, 0);
                                        transform = CATransform3DTranslate(transform, 0, 0, -halfWidth);
                                    }



                                toViewController.view.layer.transform = transform;
                                [CATransaction commit];

                                [CATransaction begin];
                                [CATransaction setCompletionBlock:^(void) {
                                    [toViewController.view.layer removeFromSuperlayer];
                                    toViewController.view.layer.transform = CATransform3DIdentity;
                                    [fromViewController.view.layer removeFromSuperlayer];
                                    superView.backgroundColor = originalBackgroundColor;
                                    [superView addSubview:fromViewController.view];
                                    [transformLayer removeFromSuperlayer];
                                    toViewController.view.userInteractionEnabled = YES;
                                }];

                                CABasicAnimation *transformAnimation = [CABasicAnimation animationWithKeyPath:@"transform"];

                                transform = CATransform3DIdentity;
                                transform.m34 = perspective;
                                transformAnimation.fromValue = [NSValue valueWithCATransform3D:transform];

                                transform = CATransform3DIdentity;
                                transform.m34 = perspective;


                                    if (direction == CubeTransitionDirectionFromRight) {
                                        transform = CATransform3DTranslate(transform, 0, 0, -halfWidth);
                                        transform = CATransform3DRotate(transform, M_PI_2, 0, 1, 0);
                                        transform = CATransform3DTranslate(transform, 0, 0, halfWidth);
                                    }
                                    else{
                                        transform = CATransform3DTranslate(transform, 0, 0, halfWidth);
                                        transform = CATransform3DRotate(transform,-M_PI_2, 0, 1, 0);
                                        transform = CATransform3DTranslate(transform, 0, 0, -halfWidth);
                                    }


                                transformAnimation.toValue = [NSValue valueWithCATransform3D:transform];

                                transformAnimation.duration = duration;

                                [transformLayer addAnimation:transformAnimation forKey:@"rotate"];
                                transformLayer.transform = transform;

                                [CATransaction commit];

                            }
                            completion:^(BOOL finished) {
                                [toViewController didMoveToParentViewController:self];
                                [fromViewController removeFromParentViewController];
                            }];

そして、3Dアニメーションは起こりますが、toViewControllerはアニメーション後に消えます..誰でも私を助けることができますか??

4

1 に答える 1

0

transitionFromViewController: メソッド呼び出しの前に 2 行がありません:

[fromViewController willMoveToParentViewController:nil];
[self addChildViewController:toViewController];

ビュー コントローラーを追加するには、基本的に、アニメーションの前に、didMoveToParentViewController の呼び出しとaddChildViewController (自動的に willMoveToParentViewController が呼び出されます) のバランスを取る必要があります。

また、View Controller を削除するには、アニメーションの前に、removeFromParentViewController の呼び出し (didMoveToParentViewController が自動的に呼び出されます) とwillMoveToParentViewControllerバランスを取る必要があります。

UIViewController クラス リファレンスを見てみましょう:コンテナー ビュー コントローラーの実装

于 2013-06-10T15:09:59.870 に答える