Wenn Sie verschiedene Ansichtssteuerungen mit schließen UIModalPresentationCustom
, wird der Bildschirm nach dem Schließen der Ansichtssteuerung schwarz, als ob alle Ansichtssteuerungen aus der Ansichtshierarchie entfernt worden wären.
Der Übergangsdelegierte ist richtig eingestellt, der animationControllerForPresentedController wird angefordert und korrekt übergeben, und der Übergang ist abgeschlossen, sobald die Animation beendet ist.
Dieser genaue Code funktioniert perfekt, wenn er mit dem iOS 7 SDK kompiliert wird, ist jedoch beim Kompilieren mit iOS 8b5 fehlerhaft
ios
objective-c
cocoa-touch
uikit
ios8
gezackte Kuh
quelle
quelle
Antworten:
Dies liegt daran, dass Sie höchstwahrscheinlich beide Präsentationen hinzufügen
[transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey]
und das präsentierte
[transitionContext viewControllerForKey:UITransitionContextToViewControllerKey]
Zeigen Sie Controller in Ihrem Container an. Zeigen Sie sie in der (void) animateTransition: (id) TransitionContext-Methode Ihres Animations-Controllers an. Da Sie eine benutzerdefinierte modale Präsentation verwenden, wird der Präsentationsansichts-Controller weiterhin unter dem Präsentationsansichts-Controller angezeigt . Da es jetzt noch sichtbar ist, müssen Sie es nicht mehr zur Containeransicht hinzufügen. Fügen Sie stattdessen nur den dargestellten Ansichts-Controller zur containerView hinzu. Sollte in Ihrer animateTransition: -Methode ungefähr 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 }
quelle
UIViewControllerContextTransitioning
Header sollten wir die-viewForKey
Methode verwenden, um die Ansichten zu erhalten. Leider ist der Präsentationsstil derUIModalPresentationCustom
Ursachen-viewForkey
in einigen Fällen gleich Null, was anscheinend das gewünschte Verhalten ist. Schauen Sie sichbcherry
die Antwort hier an .Dies ist die Art von Frage, die die hochstimmigen und akzeptierten Antworten Menschen irreführen. Lange Worte kurz.
Erstens verwenden UIModalPresentationCustom nicht, es ist nicht das, was es klingt. ( Detail )
Zweitens gibt es eine neue Methode zum Abrufen von / zu Ansichten in animateTransition. Verwenden Sie nicht mehr so etwas wie 'fromVC.view'. ( 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.
quelle
Anscheinend bin ich auf dasselbe Problem gestoßen. Ich verwende Xcode 6 Beta5.
Ich habe mit Google gesucht und festgestellt, dass jemand anderes das gleiche Problem hat. Er sagte, dies sei ein schwerwiegender Fehler in iOS 8. Ich hoffe, Apple kann dies bald beheben.
https://github.com/TeehanLax/UIViewController-Transitions-Example/issues/5
quelle
Ich habe den folgenden Code zum Block für den Abschluss des Übergangs hinzugefügt und er wurde für mich behoben.
[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]; }];
quelle
Vielleicht ist die Ansichtshierarchie mit neuem Xcode fehlerhaft, oder vielleicht ist es etwas anders als iOS8. Dieser Code hat bei mir 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;
quelle
Kurztipp: Stellen Sie sicher, dass Ihr UIViewController "Von" Ihren Erwartungen entspricht.
NSLog(@" FROM vc %@" , [[transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey] description]);
Hatte in der Vergangenheit einen ähnlichen Fehler in meinem Code. Sie können ganz einfach den richtigen VC-Kontext "Aus" herausziehen.
UIViewController *fromVC = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey]; fromView = [[[fromVC childViewControllers] firstObject] view];
quelle
Ich hatte das gleiche Problem, und was das Problem für mich verursacht hat, ist, dass ich den endgültigen Frame des toViewControllers nicht festgelegt habe. Siehe das folgende Beispiel von 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 }) }
quelle