10

Ich versuche, einen View-Controller wie unten zum modalen präsentieren:UIModalPresentationCurrentContext mit Transition?

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil]; 
UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"addPopover"]; 
vc.view.backgroundColor = [UIColor clearColor]; 
self.modalPresentationStyle = UIModalPresentationCurrentContext; 
[self presentModalViewController:vc animated:YES]; 

Jetzt UIModalPresentationCurrentContext bedeuten ich mit dieser Ansicht mit einem transparenten Hintergrund präsentieren und meinen anderen Blick hinter dem neuen sehen. Es hindert mich jedoch daran, es mit einem Übergang zu präsentieren.

Irgendwelche Ideen warum? Oder wie kann ich das umgehen? Vielen Dank.

+0

Wie ist der Präsentationsstil des ViewControllers, von dem Sie präsentieren? – brynbodayle

+0

@bbodyle, ich habe das gleiche Problem, und ich habe alle Präsentation Stile/Kombinationen auf beiden ViewControllern versucht. –

Antwort

11

Vollbildmodale sollen nicht ermöglichen, die Unterschicht zu sehen. Ärgerlich, ich weiß.

Von Ihrem Code nehme ich an, dass "addPopover" tatsächlich eine Vollbildansicht ist, wo Sie Ihren Inhalt als Unterabschnitt haben, während der Rest transparent ist.

Try this:

vc.modalPresentationStyle = UIModalPresentationCurrentContext; 
vc.modalTransitionStyle = UIModalTransitionStyleCoverVertical; 
[self presentViewController:vc animated:YES completion:NULL]; 

Hinweis: Ich würde empfehlen, eine niedrige Alpha-Hintergrundfarbe addiere die Benutzer wissen zu lassen, dass sie nicht mit dem Rest der Ansicht interagieren können, wenn Sie diese über Top-Pop. ..

+1

Was ist anders hier? Das Festlegen von "modalTransitionStyle" in der Zielansicht hat keinen Unterschied gemacht und auch "presentViewController" nicht über "presentModalViewController" verwendet. –

+0

Zuweisen des Übergangsstils zu "vc" anstelle von "self" und Verwenden der 'presentViewController'-Methode. Ohne Ihr Storyboard zu sehen, ist es schwierig zu diagnostizieren, ob das nicht funktioniert. Bei der obigen Methode muss Ihr überlagerter VC die selbe Größe wie "self" haben (oder in der Lage sein, die Größe zu ändern) –

+2

Ja, in meinem Projekt haben beide ViewController die gleiche Größe. Ich habe deinen Code ausprobiert und es gab keine Veränderung. Die Eigenschaftseinstellung 'modalPresentationStyle = UIModalPresentationCurrentContext' muss hier auf self, nicht auf vc angewendet werden. Ich schätze, ich muss meine eigene Frage beginnen, anstatt Kopfgeld dafür anzubieten, weil es hier keine Lösung gibt, obwohl sie als eine markiert ist. –

25

Ich konnte dies erreichen, indem ich modalPresentationStyle = UIModalPresentationCurrentContext auf dem rootViewController meiner UIWindow, wenn ich keine neuen Vollbild-ViewControllern auf diesem rootViewController vorgestellt. Ich habe so etwas wie dies:

UIViewController *rootViewController = [UIApplication sharedApplication].delegate.window.rootViewController; 
rootViewController.modalPresentationStyle = UIModalPresentationCurrentContext; 
[self presentViewController:vc animated:YES completion:nil]; 

Ich habe schon versucht, diese sowohl mit einer UINavigationController als mein Fenster des RootViewController und verschiedene andere benutzerdefinierte Ansicht Controller. Es scheint, solange der rootViewController des Fensters weiß, was vor sich geht, können alle sub-viewControllers presentViewController:animated:completion: aufrufen, ohne die zugrunde liegende Ansicht auszublenden.

Nehmen wir an, Sie präsentieren einen anderen viewController über dem rootViewController Ihres Fensters. Und dieser neue viewController wird mit modalPresentationStyle = UIModalPresentationFullScreen präsentiert (dh nimmt den Bildschirm auf), dann müssen Sie modalPresentationStyle = UIModalPresentationCurrentContext auf diesem obersten ViewController aufrufen.

So zu rekapitulieren:

  • Wenn Sie UINavigationController haben -> UIViewController (n) (sie geschoben werden konnte und in die und aus knallte), dann setzen Sie modalPresentationStyle = UIModalPresentationCurrentContext auf dem UINavigationController.
  • Wenn Sie UINavigationController -> UIViewController -> new-UIViewController (mit modalPresentationStyle auf UIModalPresentationFullScreen gesetzt) ​​haben, dann setzen Sie modalPresentationStyle = UIModalPresentationCurrentContext auf dem neuen UIViewController.

Hoffentlich funktioniert das für euch auch!

+1

Das hat für mich funktioniert. Der Schlüssel war, den modalPresentationStyle auf dem präsentierenden View-Controller zu setzen, nicht auf dem View-Controller. –

+0

Was ist, wenn Sie es auf einem UISplitViewController präsentieren? –

+0

Danke dafür! –

0

Mr. T Vorschläge arbeitete fast perfekt, man muss nur die Übergangsanimation Viewcontroller

auf den vorgestellten verlieren Da es auch ist die appDelegates RootViewController Präsentation Stil einstellen, wird es auch den Übergang Animationen für alle Ansichten aus, dass präsentiert entfernen Punkt.

Mein fix war die AppDelegates RootViewController Präsentation Stil zurück zurückzukehren, um es Standard ist, wenn der Viewcontroller geschlossen ist, dass ich den transparenten Hintergrund benötigen auf

Ich habe eine Schaltfläche, den presentedViewController, dass entlässt ich auch die Präsentation eingestellt Stil der rootViewController zurück zum Standard mit:

UIViewController *rootViewController = [[[[UIApplication sharedApplication] delegate] window] rootViewController]; 
    rootViewController.modalPresentationStyle = UIModalPresentationFullScreen; 

Ich hoffe, dass hilft jemand anderes auf dieses Problem ratlos.