Dalein
@Dalein
iOS developer

ViewController не активен после cancelInteractiveTransition?

Пытаюсь сделать переход как в приложении Почта на iOS8, то есть окно нового письма можно смахнуть вниз и продолжить работу на первом экране. Такой переход отлично работает, но проблема в том, что когда второе окно внизу, первый контроллер не активный, не реагирует на нажатия. Для решения этой проблемы я в методе startInteractiveTransition: сделал
[containerView insertSubview:nonModalVC.view belowSubview:modalVC.view];
: Что по хорошему делать нельзя, но с таким подходом в "свернутом" состоянии nonModalVC реагирует на нажатия. Однако теперь при finishInteractiveTransition остается только черный экран. Кто нибудь сталкивался с таким? Или используя Transitioning в принципе нельзя добиться того что я хочу?
Ниже мой код:

- (id <UIViewControllerAnimatedTransitioning>)animationControllerForPresentedController:(UIViewController *)presented
                                                                   presentingController:(UIViewController *)presenting
                                                                   sourceController:(UIViewController *)source {
    return self;
}

- (id <UIViewControllerAnimatedTransitioning>)animationControllerForDismissedController:(UIViewController *)dismissed{
    return self;
}

- (id <UIViewControllerInteractiveTransitioning>)interactionControllerForPresentation:(id <UIViewControllerAnimatedTransitioning>)animator{
    return  nil;
}

- (id <UIViewControllerInteractiveTransitioning>)interactionControllerForDismissal:(id <UIViewControllerAnimatedTransitioning>)animator{
    return self;
}

#pragma mark - UIViewControllerInteractiveTransitioning

- (void)startInteractiveTransition:(id <UIViewControllerContextTransitioning>)transitionContext {

    self.transitionContext = transitionContext;

    UIViewController *modalVC = [self.transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
    UIViewController *nonModalVC = [self.transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
    UIView *containerView = [self.transitionContext containerView];
    [containerView insertSubview:nonModalVC.view belowSubview:modalVC.view];

    [self updateInteractiveTransition:0.0];
} 

#pragma mark - UIPercentDrivenInteractiveTransition

- (void)updateInteractiveTransition:(CGFloat)percentComplete{

    if (percentComplete < 0) {
        percentComplete = 0;
    }
    else if (percentComplete > 1){
        percentComplete = 1;
    }

    UIViewController *modalVC = [self.transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
    UIViewController *nonModalVC = [self.transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];

    float scaleFactor = 0.9 + 0.1 * percentComplete;
    float alphaVal = 0.5 + 0.5 * percentComplete;
    nonModalVC.view.transform = CGAffineTransformScale(CGAffineTransformIdentity, scaleFactor, scaleFactor);
    nonModalVC.view.alpha = alphaVal;


    CGRect modalVCFrame = modalVC.view.frame;
    modalVCFrame.origin.y = percentComplete * viewH + kModalViewYOffset;
    modalVC.view.frame = modalVCFrame;
}

- (void)cancelInteractiveTransitionWithDuration:(CGFloat)duration{

    UIViewController *modalVC = [self.transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
    UIViewController *nonModalVC = [self.transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];

    CGRect modalVCFrame = modalVC.view.frame;
    modalVCFrame.origin.y = self.cancelUp ? kModalViewYOffset : viewH - kModalViewNavBarHeight;
    NSLog(@"modalVCFrame.origin.y = %f", modalVCFrame.origin.y);
    CGAffineTransform transformVal = self.cancelUp ?
                                                CGAffineTransformMakeScale(kNonModalViewMinScale, kNonModalViewMinScale)
                                                : CGAffineTransformIdentity;
    CGFloat alphaVal = self.cancelUp ? 0.5 : 1.0;

    [UIView animateWithDuration:duration animations:^{
        modalVC.view.frame = modalVCFrame;
        nonModalVC.view.transform = transformVal;
        nonModalVC.view.alpha = alphaVal;
    } completion:^(BOOL finished) {
        [self cancelInteractiveTransition];
    }];

    reversed = NO;
}


- (void)finishInteractiveTransitionWithDuration:(CGFloat)duration{

    UIViewController *modalVC = [self.transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
    UIViewController *nonModalVC = [self.transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];

    CGRect modalVCFrame = modalVC.view.frame;
    modalVCFrame.origin.y = viewH ; //+ kModalViewNavBarHeight;

    [UIView animateWithDuration:duration animations:^{
        modalVC.view.frame = modalVCFrame;
        nonModalVC.view.transform = CGAffineTransformIdentity;
        nonModalVC.view.alpha = 1.0;
    } completion:^(BOOL finished) {

        [modalVC.view removeFromSuperview];
        [self.transitionContext completeTransition:YES];
        self.transitionContext = nil;

        [self finishInteractiveTransition];

    }];

    reversed = NO;
}
  • Вопрос задан
  • 165 просмотров
Решения вопроса 1
Dalein
@Dalein Автор вопроса
iOS developer
Решил проблему. Первое - не добавлять ничего в containerView во время dismissing. Второе - я сделал категорию UIView и переписал метод hitTest:withEvent: чтобы он "пропускал" через себя нажатия, когда модальное окно "свернуто".
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
23 нояб. 2024, в 01:31
1000 руб./за проект
23 нояб. 2024, в 00:16
2000 руб./за проект
22 нояб. 2024, в 23:55
3000 руб./за проект