Ich versuche, einen Ansichts-Controller modal mit einem transparenten Hintergrund darzustellen. Mein Ziel ist es, die Ansicht der präsentierenden und der präsentierten View Controller gleichzeitig anzeigen zu lassen. Das Problem ist, dass nach Abschluss der Präsentationsanimation die Ansicht des Präsentationsansichts-Controllers verschwindet.
- (IBAction)pushModalViewControllerButtonPressed:(id)sender
{
ModalViewController *modalVC = [[ModalViewController alloc] init];
[self presentViewController:modalVC animated:YES completion:nil];
}
Ich weiß, dass ich die Ansicht einfach als Unteransicht hinzufügen könnte, aber ich möchte diese Lösung aus irgendeinem Grund vermeiden. Wie könnte ich das beheben?
Antworten:
Dieser folgende Code funktioniert nur auf dem iPad.
Ich würde mit dem Hinzufügen einer Unteransicht gehen.
Hier ist eine sehr gute Diskussion. Schauen Sie sich die Kommentare genau an. Nicht nur die Antwort.
Modale Ansicht
Wenn ich du wäre, würde ich es nicht tun. Ich würde eine Unteransicht hinzufügen und es tun. Es scheint mir eine bessere Kontrolle über die Dinge zu geben.
BEARBEITEN:
Wie von Paul Linsay erwähnt, ist seit iOS 8 nur
UIModalPresentationOverFullScreen
der modalPresentationStyle des ViewController erforderlich. Dies würde auch Navigationsleisten- und Registerkartenschaltflächen abdecken.quelle
modalPresentationStyle = UIModalPresentationCurrentContext
auf dem Presenter View Controller angeben müssen und nicht in der vorgestellten .ViewController
Ihrer Ansichtshierarchie festlegen . (z. B. aNavigationController
oder die Instanz Ihres Dia-Menüansichts-Controllers zum Beispiel).UIModalPresentationCustom
, und nur, wenn er direkt vorpresentViewController
und nicht in eingestellt wurdeviewDidLoad
.modalPresentationStyle
vorherviewDidLoad
einstellen müssen . Ich habe es im Konstruktor gemacht und es hat funktioniert.Für diejenigen, die versuchen, dies in iOS 8 zum Laufen zu bringen, ist die "von Apple genehmigte" Möglichkeit, einen transparenten Controller
modalPresentationStyle
für die modale Ansicht anzuzeigen, die Einstellung auf dem aktuellen ED- Controller aufUIModalPresentationOverCurrentContext
.Dies kann im Code oder durch Festlegen der Eigenschaften des Segues im Storyboard erfolgen.
Aus der UIViewController-Dokumentation:
https://developer.apple.com/documentation/uikit/uiviewcontroller
Das Video "View Controller Advancements in iOS 8" von WWDC 2014 geht ausführlich darauf ein.
Hinweis:
viewDidLoad
präsentierten ViewController hat keine Auswirkungenquelle
sourceVC
istself.navigationController
. Auch nachdem ich den Zielpräsentationsstil als benutzerdefiniert festgelegt hatte, konnte ich ihn durchschauen.[sourceVC setModalPresentationStyle:UIModalPresentationCurrentContext];
,[targetVC setModalPresentationStyle:UIModalPresentationCustom];
Hoffentlich wird es jemand helfen.presentedVC.modalPresentationStyle = UIModalPresentationOverCurrentContext
den präsentierenden VC an. Funktioniert nicht in der präsentierten VC. Vertrau mir, ich habe es versucht.In iOS 8.0 und höher können Sie dazu die Eigenschaft modalPresentationStyle auf UIModalPresentationOverCurrentContext setzen
quelle
.custom
und.overFullScreen
funktioniert..overFullScreen
die aktuelle Ansicht einstellen, werden die ControllerviewWillAppear
nicht aufgerufen.presentedController.view.backgroundColor = #color#
sollte inpresentedController
's geschrieben werdenviewDidLoad
, sonst wirdpresentedController
das Leben unterbrochen.Dieser Code funktioniert auf dem iPhone unter iOS6 und iOS7 einwandfrei:
In diesem Fall verpassen Sie eine Slide-On-Animation. Um die Animation beizubehalten, können Sie weiterhin die folgende "nicht elegante" Erweiterung verwenden:
Befindet sich unser PresentingV innerhalb von UINavigationController oder UITabbarController, müssen Sie mit diesen Controllern als PresentingVC arbeiten.
Außerdem können Sie in iOS7 benutzerdefinierte Übergangsanimationen implementieren, die ein
UIViewControllerTransitioningDelegate
Protokoll anwenden . In diesem Fall erhalten Sie natürlich einen transparenten HintergrundVor dem Präsentieren müssen Sie zunächst festlegen
modalPresentationStyle
Dann müssen Sie zwei Protokollmethoden implementieren
Als letztes müssen Sie Ihren benutzerdefinierten Übergang in der
CustomAnimatedTransitioning
Klasse definierenquelle
modalPresentationStyle
befindet, stellen Sie sicher, dass dieser ebenfalls eingestellt ist!Ich hatte ein wenig Probleme mit dem Interface Builder von XCode 7, um den Präsentationsstil wie von @VenuGopalTewari vorgeschlagen festzulegen. In dieser Version scheint es keine zu sein
Over Current Context
oderOver Full Screen
für den Übergang Präsentationsmodus. Damit es funktioniert, habe ich den Modus auf Folgendes eingestelltDefault
:mit
Zusätzlich habe ich den Präsentationsmodus des modal präsentierten View Controllers auf Folgendes eingestellt
Over Full Screen
:quelle
Erstellen Sie einen Segue für die modale Präsentation und setzen Sie die Presentation-Eigenschaft dieses Segues auf über den aktuellen Kontext. Es funktioniert zu 100%
quelle
PresentViewController mit transparentem Hintergrund - in iOS 8 und iOS 9
Stellen Sie in MYViewController die Hintergrundfarbe Schwarz ein und reduzieren Sie die Deckkraft
quelle
Es ist ein bisschen hackig, aber für mich funktioniert dieser Code (iOS 6):
Dieser Code funktioniert auch auf dem iPhone
quelle
Diese Kategorie hat bei mir funktioniert (ios 7, 8 und 9)
H-Datei
M-Datei
quelle
Die Lösung für diese Antwort mit Swift wäre wie folgt.
quelle
Wenn Sie Storyboard verwenden, können Sie diesen Schritt ausführen:
quelle
Ich habe diese drei Zeilen in der init-Methode im dargestellten Ansichts-Controller hinzugefügt und funktioniert wie ein Zauber:
BEARBEITEN (funktioniert unter iOS 9.3):
Gemäß Dokumentation:
Verfügbar in iOS 8.0 und höher.
quelle
Alternativ können Sie auch eine "Containeransicht" verwenden. Machen Sie einfach Alpha unter 1 und binden Sie es mit der Sequenz ein. XCode 5, Ziel iOS7. Auf dem iPhone getestet.
Containeransicht ab iOS6 verfügbar. Link zum Blogbeitrag darüber.
quelle
Ich habe ein Objekt erstellt, das die Darstellung eines so genannten "überlagerten Modals" übernimmt. Dies bedeutet, dass die Ansicht des Hintergrunds beibehalten wird und Sie ein Modal mit transparentem Hintergrund erstellen können.
Es gibt eine einzige einfache Methode, die dies tut:
Es ist wichtig, die
modalPresentationCapturesStatusBarAppearance
Eigenschaft aufYES
festzulegen und die Aktualisierung der Statusleiste zu erzwingen, wenn Ihr dargestellter Ansichts-Controller einen anderen hatpreferredStatusBarStyle
.Dieses Objekt sollte eine haben
@property (assign, nonatommic) isPresenting
Sie wollen diese Aufgabe auf die erfüllen
UIViewControllerAnimatedTransitioning
undUIViewControllerTransitioningDelegate
Protokolle und die folgenden Methoden implementieren:und:
Dadurch wird eine Animation von unten nach unten ausgeführt, die die standardmäßige modale Animation nachahmt. Sie können sie jedoch beliebig gestalten.
Wichtig ist, dass die Ansicht des präsentierenden View Controllers im Hintergrund bleibt und Sie einen transparenten Effekt erzielen.
Diese Lösung funktioniert für iOS 7+
quelle
Ein sehr einfacher Weg, dies zu tun (
Storyboards
zum Beispiel mit), ist:Dies wird
UIViewController
aStoryboard
modal, aber mit einem durchscheinenden Hintergrund dargestellt.quelle
Arbeiten für iOS 7-10
quelle
Um all die guten Antworten und Kommentare hier zusammenzufassen und trotzdem eine Animation zu haben, während
ViewController
ich zu Ihrem neuen wechsle, habe ich Folgendes getan: (Unterstützt iOS 6 und höher)Wenn Sie ein
UINavigationController
\ verwenden, istUITabBarController
dies der richtige Weg:Wenn Sie das tun, verlieren Sie Ihre
modalTransitionStyle
Animation. Um es zu lösen, können Sie IhrerSomeViewController
Klasse ganz einfach Folgendes hinzufügen :quelle
Natürlich sollten Sie UIModalPresentationCurrentContext festlegen, aber der Ort zum Festlegen von clearColor ist auch sehr wichtig! Sie können den Hintergrund in der viewDidLoad-Funktion nicht festlegen, sondern vor dem Laden der Ansicht wie im Root-View-Controller oder in der Init-Funktion des Controllers, der angezeigt wird!
oder
quelle
Wenn Sie Modal Segue verwenden, stellen Sie sicher, dass Sie es als dieses Bild festlegen (Sie können die Animation deaktivieren, wenn Sie möchten).
quelle
Eine vollständige Methode, die unter iOS 7 und iOS 8 getestet wurde.
quelle
Swift 4.2
quelle
in appdelegate:
in Ihrer ersten Ansicht Controller, von wo aus Sie die nächste Ansicht laden müssen:
in Ihrem nextViewController, der transparent hinzugefügt werden soll:
quelle
Wir müssen unser Modal richtig einstellen.
Bildlink-Ziel
Zuerst müssen wir den Ansichtshintergrund des View Controllers in Farbe löschen ändern. Es bedeutet einfach, dass es transparent sein sollte. Standardmäßig ist diese Ansicht weiß.
Zweitens müssen wir den Segue auswählen, der zum Anmeldebildschirm führt, und im Attributinspektor die Präsentation auf Über aktuellen Kontext setzen. Diese Option ist nur verfügbar, wenn das automatische Layout und die Größenklassen aktiviert sind.
Bildlink-Ziel
quelle
Stellen Sie die Navigation
modalPresentationStyle
auf einUIModalPresentationCustom
und stellen Sie die Hintergrundfarbe Ihres präsentierten View Controllers als klare Farbe ein.
quelle