it-swarm.com.ru

iOS 8 - пустой экран после закрытия контроллера представления с пользовательской презентацией

При отклонении различных контроллеров представления с использованием UIModalPresentationCustom экран становится черным после того, как контроллер представления отклонен, как если бы все контроллеры представления были удалены из иерархии представления.

Переходящий делегат настроен правильно, animationControllerForPresentedController запрашивается и передается правильно, и переход завершается после завершения анимации. 

Этот точный код отлично работает при компиляции с iOS 7 SDK, но не работает при компиляции с iOS 8b5 

63
jaggedcow

Это потому, что вы, скорее всего, добавляете

[transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey] 

и представленный 

[transitionContext viewControllerForKey:UITransitionContextToViewControllerKey] 

просматривать контроллеры для вашего контейнера в методе (void) animateTransition: (id) transitionContext вашего контроллера анимации. Поскольку вы используете пользовательскую модальную презентацию, представление контроллера представления все еще отображается под представленным контроллером представления . Теперь, поскольку он все еще виден, вам не нужно добавлять его в представление контейнера. Вместо этого только добавьте представленный контроллер представления в containerView. Должно выглядеть примерно так внутри вашего animateTransition: метод 

UIView *containerView = [transitionContext containerView];
UIViewController *fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
UIViewController *toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];

// Boolean value to determine presentation or dismissal animation
if (self.presenting){        
    [transitionContext.containerView addSubview:toViewController.view];
    // Your presenting animation code
} else {
    // Your dismissal animation code
}
169
DJSK

Это тот тип вопроса, на который большинство проголосовавших и принявших ответ вводят в заблуждение людей. Длинные слова короткие.

Во-первых, не используйте UIModalPresentationCustom, это не то, на что это похоже. ( подробно )

Во-вторых,, есть новый метод для извлечения из/в Views в animateTransition, больше не используйте что-то вроде «fromVC.view». ( Зачем )

UIViewController *fromVC = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
UIViewController *toVC = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
UIView *fromView = [transitionContext viewForKey:UITransitionContextFromViewKey];
UIView *toView = [transitionContext viewForKey:UITransitionContextToViewKey];

//Swift
let fromVC = transitionContext.viewControllerForKey(UITransitionContextFromViewControllerKey)
let toVC = transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey)
let fromView = transitionContext.viewForKey(UITransitionContextFromViewKey)
let toView = transitionContext.viewForKey(UITransitionContextToViewKey)

Теперь черный экран должен исчезнуть.

18
Lcsky

Кажется, я столкнулся с той же проблемой, я использую Xcode 6 beta5.

Я искал в Google и обнаружил, что у кого-то еще есть такая же проблема, и они сказали, что это серьезная ошибка в iOS 8, поэтому надеюсь, что Apple сможет исправить это в ближайшее время.

https://github.com/TeehanLax/UIViewController-Transitions-Example/issues/5

5
billbai

Возможно, иерархия представления глючит с новым XCode или, может быть, она немного отличается от iOS8. Этот код работал для меня. Добавьте его при отклонении контроллера в методе animateTransition: transitionContext.

[[UIApplication sharedApplication].keyWindow addSubview:toViewController.view];
toViewController.view.userInteractionEnabled = YES;
2
Gautam Jain

Я добавил код ниже в блок завершения перехода, и он исправил это для меня.

[UIView animateWithDuration:[self transitionDuration:transitionContext] animations: ^{
    // Animation code

 } completion: ^(BOOL finished) {
     // More of your code

     // Add the following line before completing the transition
    [[[UIApplication sharedApplication] keyWindow] sendSubviewToBack:toViewController.view];

    // Complete the transition
    [transitionContext completeTransition:YES];
}];
2
devgeek

У меня была та же самая проблема, и то, что вызвало проблему для меня, - то, что я не устанавливал заключительный кадр toViewController. Смотрите следующий пример из http://www.appcoda.com/custom-view-controller-transitions-tutorial/

func animateTransition(transitionContext: UIViewControllerContextTransitioning) {

    let fromViewController = transitionContext.viewControllerForKey(UITransitionContextFromViewControllerKey)!
    let toViewController = transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey)!
    let finalFrameForVC = transitionContext.finalFrameForViewController(toViewController)
    let containerView = transitionContext.containerView()
    let bounds = UIScreen.mainScreen().bounds
    toViewController.view.frame = CGRectOffset(finalFrameForVC, 0, bounds.size.height)
    containerView.addSubview(toViewController.view)

    UIView.animateWithDuration(transitionDuration(transitionContext), delay: 0.0, usingSpringWithDamping: 0.5, initialSpringVelocity: 0.0, options: .CurveLinear, animations: {
        fromViewController.view.alpha = 0.5
        toViewController.view.frame = finalFrameForVC
    }, completion: {
        finished in
        transitionContext.completeTransition(true)
        fromViewController.view.alpha = 1.0
    })
} 
0
eliasbagley

Совет: убедитесь, что ваш "From" UIViewController - это то, что вы ожидаете.

    NSLog(@" FROM vc %@" , [[transitionContext  viewControllerForKey:UITransitionContextFromViewControllerKey] description]);

В прошлом в моем коде была похожая ошибка. Вы можете легко извлечь правильный контекст «From» VC.

  UIViewController *fromVC = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];  
  fromView =  [[[fromVC childViewControllers] firstObject]  view];
0
smaura777