it-swarm.com.de

iOS 8 - Bildschirm leer, nachdem Ansichts-Controller mit benutzerdefinierter Präsentation geschlossen wurde

Wenn Sie verschiedene View-Controller mit UIModalPresentationCustom schließen, wird der Bildschirm schwarz, nachdem der View-Controller geschlossen wurde, als ob alle View-Controller aus der Ansichtshierarchie entfernt worden wären.

Der übergebende Delegat ist ordnungsgemäß festgelegt, der animationControllerForPresentedController wird nach dem richtigen Abfragen gefragt, und der Übergang wird abgeschlossen, sobald die Animation abgeschlossen ist. 

Dieser genaue Code funktioniert einwandfrei, wenn er mit dem iOS 7-SDK kompiliert wird. Er ist jedoch fehlerhaft, wenn er mit iOS 8b5 kompiliert wird 

63
jaggedcow

Dies liegt daran, dass Sie höchstwahrscheinlich beide Präsentationen hinzufügen

[transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey] 

und das präsentierte 

[transitionContext viewControllerForKey:UITransitionContextToViewControllerKey] 

anzeigen von Controllern für Ihre containerView in der (void) animateTransition: (id) transitionContext-Methode Ihres Animationscontrollers. Da Sie eine benutzerdefinierte modale Präsentation verwenden, wird der Presenting View Controller immer noch unter dem Presented View Controller angezeigt. Da es immer noch sichtbar ist, müssen Sie es nicht zur Containeransicht hinzufügen. Fügen Sie stattdessen nur den präsentierten View Controller zur containerView hinzu. Sollte in Ihrer animateTransition: -Methode so aussehen 

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

Dies ist die Art von Frage, die von den hohen Stimmen und der akzeptierten Antwort irreführend ist. Lange Worte kurz.

Erstens, verwenden Sie nicht UIModalPresentationCustom, es klingt nicht so. ( Detail )

Zweitens gibt es eine neue Methode zum Abrufen von Ansichten in/an Views in animateTransition. Verwenden Sie etwas wie 'fromVC.view' nicht mehr. ( Warum )

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)

Jetzt sollte der schwarze Bildschirm verschwinden.

18
Lcsky

Es scheint, dass ich das gleiche Problem hatte, ich verwende Xcode 6 beta5.

Ich habe mit Google gesucht und festgestellt, dass jemand anderes das gleiche Problem hat, und sie sagten, dies sei ein schwerwiegender Fehler in iOS 8. Ich hoffe, Apple kann das bald beheben.

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

5
billbai

Vielleicht ist die Ansichtshierarchie mit dem neuen Xcode fehlerhaft oder vielleicht ist es ein wenig anders als iOS8. Dieser Code hat für mich funktioniert. Fügen Sie es hinzu, während Sie den Controller in der Methode animateTransition: transitionContext schließen.

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

Ich habe den Code unten in den Übergangsabschlussblock eingefügt, der für mich behoben wurde.

[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

Ich hatte das gleiche Problem, und was das Problem für mich verursacht hat, ist, dass ich nicht das letzte Bild von toViewController gesetzt habe. Siehe das folgende Beispiel aus 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

Schneller Tipp: Stellen Sie sicher, dass Ihr UIViewController "From" das ist, was Sie erwarten.

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

Hatte in der Vergangenheit einen ähnlichen Fehler in meinem Code. Sie können den rechten Kontext "From" VC leicht herausziehen.

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