Пытаюсь сделать переход как в приложении Почта на 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;
}