Подтвердить что ты не робот

IOS 8 - Заставка экрана после отклонения контроллера просмотра с пользовательской презентацией

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

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

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

4b9b3361

Ответ 1

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

[transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey]

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

[transitionContext viewControllerForKey:UITransitionContextToViewControllerKey]

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

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
}

Ответ 2

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

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

Во-вторых,, есть новый метод для извлечения из/в представления в 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)

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

Ответ 3

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

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

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

Ответ 4

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

[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];
}];

Ответ 5

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

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

Ответ 6

Быстрый совет: убедитесь, что ваш "От" UIViewController - это то, что вы ожидаете.

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

У меня была аналогичная ошибка в моем коде в прошлом. Вы можете легко вытащить правильный контекст "От" VC.

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

Ответ 7

У меня была такая же проблема, и для меня возникла проблема в том, что я не устанавливал окончательный кадр 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
    })
}