2

新しい iOS7 API を使用して、インタラクティブなカスタム モーダル UIViewController トランジションを実装しようとしています。新しいものを使用しない限り、すべてが希望どおりに機能しています

 + (void)animateWithDuration:(NSTimeInterval)duration delay:(NSTimeInterval)delay usingSpringWithDamping:(CGFloat)dampingRatio initialSpringVelocity:(CGFloat)velocity options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion

トランジションをアニメーション化するメソッド。ボタンを介してトランジションを呼び出すと、正常に動作します。この問題は、遷移がインタラクティブで、GestureRecognizer によって駆動される場合に発生します。指を離すと、アニメーションがすぐに切れて終了しません。私が使用する場合、同じコードが機能しています

animateWithDuration:delay:options:animations:completion:

代わりは。

トランジションをアニメーション化するコードは次のとおりです。

- (void)animateTransition:(id <UIViewControllerContextTransitioning>)transitionContext {
   UIViewController *fromViewController = [transitionContext  viewControllerForKey:UITransitionContextFromViewControllerKey];
   UIViewController *toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
   CGRect fullFrame = transitionContext.containerView.frame;

if (!self.dismissal) {
    [transitionContext.containerView addSubview:fromViewController.view];
    [transitionContext.containerView addSubview:toViewController.view];
    fromViewController.view.frame = fullFrame;
    toViewController.view.frame = CGRectMake(0, fullFrame.size.height, 0, 0);

    [UIView animateWithDuration:[self transitionDuration:transitionContext] delay:0 usingSpringWithDamping:0.5 initialSpringVelocity:0.5 options:UIViewAnimationOptionTransitionNone animations:^{
        //animation
        toViewController.view.frame = CGRectMake(0,0, fullFrame.size.width, fullFrame.size.height);
    } completion:^(BOOL finished) {
        [transitionContext completeTransition:![transitionContext transitionWasCancelled]];
    }];

} else {
    [transitionContext.containerView addSubview:toViewController.view];
    [transitionContext.containerView addSubview:fromViewController.view];
    fromViewController.view.frame = fullFrame;

    [UIView animateWithDuration:[self transitionDuration:transitionContext] delay:0 usingSpringWithDamping:.5 initialSpringVelocity:.5 options:0 animations:^{
        fromViewController.view.frame = CGRectMake(0, fullFrame.size.height, fullFrame.size.width, fullFrame.size.height);
    } completion:^(BOOL finished) {
        [transitionContext completeTransition:![transitionContext transitionWasCancelled]];
    }];

//This is working fine
//        [UIView animateWithDuration:[self transitionDuration:transitionContext]/2       animations:^{
//            fromViewController.view.frame = CGRectMake(0, fullFrame.size.height, fullFrame.size.width, fullFrame.size.height);
//        } completion:^(BOOL finished) {
//            [transitionContext completeTransition:![transitionContext transitionWasCancelled]];
//        }];
}

これは、ジェスチャ レコグナイザーの背後にあるコードです。

#pragma mark - Gesture recognition
- (void)handlePan:(UIScreenEdgePanGestureRecognizer *)pgr
{

CGPoint translation = [pgr translationInView:pgr.view];
CGFloat percentage  = fabs(translation.x / CGRectGetWidth(pgr.view.frame));

switch (pgr.state) {
    case UIGestureRecognizerStateBegan:
        self.interactionInProgress = YES;
        [self.respondingVC proceedToNextViewController];
        break;

    case UIGestureRecognizerStateChanged: {
        [self updateInteractiveTransition:percentage];
        break;
    }

    case UIGestureRecognizerStateEnded:
        if(percentage < 0.5) {
            [self cancelInteractiveTransition];
        } else {
            [self finishInteractiveTransition];
        }
        self.interactionInProgress = NO;
        break;

    case UIGestureRecognizerStateCancelled:
        [self cancelInteractiveTransition];
        self.interactionInProgress = NO;

    default:
        break;
}
}
4

1 に答える 1