Da es keine vollständige, endgültige Antwort auf diese häufig wiederkehrende Frage gibt, werde ich sie hier stellen und beantworten.
Oft müssen wir eine UIViewController
so präsentieren, dass sie nicht den gesamten Bildschirm abdeckt, wie im Bild unten.
Apple bietet verschiedene ähnliche Funktionen an UIViewController
, z. B. UIAlertView
Twitter oder Facebook Share View Controller usw.
Wie können wir diesen Effekt für einen benutzerdefinierten Controller erzielen?
ios
iphone
uiviewcontroller
popup
uialertview
CRDave
quelle
quelle
Antworten:
HINWEIS: Diese Lösung ist in iOS 8 defekt. Ich werde die neue Lösung so schnell wie möglich veröffentlichen.
Ich werde hier mit Storyboard antworten, aber es ist auch ohne Storyboard möglich.
Init: Erstellen Sie zwei
UIViewController
im Storyboard.FirstViewController
was normal ist undSecondViewController
welches das Popup sein wird.Modal Segue: Setzen Sie
UIButton
in FirstViewController und Segue auf diese erstellenUIButton
zuSecondViewController
modal segue.Transparent machen: Wählen Sie nun
UIView
(UIView
die standardmäßig mit erstellt wirdUIViewController
) vonSecondViewController
und ändern Sie die Hintergrundfarbe in klare Farbe.Machen Hintergrund Dim: Fügen Sie ein
UIImageView
inSecondViewController
der ganzen Bildschirm ausfüllt und setzt sein Bild bis zu einem gewissen gedimmt halbtransparentes Bild. Ein Beispiel erhalten Sie hier:UIAlertView
HintergrundbildDisplay-Design: Fügen Sie nun ein Design hinzu
UIView
und erstellen Sie ein beliebiges Design, das Sie anzeigen möchten. Hier ist ein Screenshot meines StoryboardsSecondViewController
als Popup geöffnet wird , um nach Benutzername und Passwort zu fragenWichtig: Nun zum Hauptschritt. Wir möchten, dass
SecondViewController
FirstViewController dadurch nicht vollständig ausgeblendet wird. Wir haben klare Farben eingestellt, aber das reicht nicht aus. Standardmäßig wird hinter der Modellpräsentation Schwarz hinzugefügt, sodass in viewDidLoad von eine Codezeile hinzugefügt werden mussFirstViewController
. Sie können es auch an einer anderen Stelle hinzufügen, es sollte jedoch vor dem Übergang ausgeführt werden.[self setModalPresentationStyle:UIModalPresentationCurrentContext];
Entlassen: Wann entlassen werden muss, hängt von Ihrem Anwendungsfall ab. Dies ist eine modale Präsentation. Um dies zu verwerfen, tun wir das, was wir für eine modale Präsentation tun:
[self dismissViewControllerAnimated:YES completion:Nil];
Das ist alles.....
Vorschläge und Kommentare sind willkommen.
Demo: Sie können das Demo-Quellprojekt von Here: Popup Demo herunterladen
NEU : Jemand hat bei diesem Konzept sehr gute Arbeit geleistet: MZFormSheetController
Neu : Ich habe einen weiteren Code gefunden, um diese Art von Funktion zu erhalten: KLCPopup
+ (void)setPresentationStyleForSelfController:(UIViewController *)selfController presentingController:(UIViewController *)presentingController { if (iOSVersion >= 8.0) { presentingController.providesPresentationContextTransitionStyle = YES; presentingController.definesPresentationContext = YES; [presentingController setModalPresentationStyle:UIModalPresentationOverCurrentContext]; } else { [selfController setModalPresentationStyle:UIModalPresentationCurrentContext]; [selfController.navigationController setModalPresentationStyle:UIModalPresentationCurrentContext]; } }
Kann diese Methode in prepareForSegue deligate wie folgt verwenden
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { PopUpViewController *popup = segue.destinationViewController; [self setPresentationStyleForSelfController:self presentingController:popup] }
quelle
[self setModalPresentationStyle:UIModalPresentationCurrentContext];
scheint die Modalübergangsanimation (UIModalTransitionStyleCrossDissolve
zum Beispiel) beim Präsentieren des Second View Controllers zu unterbrechen, sodass sie nur ohne Animation angezeigt wird. Irgendwelche Gedanken, wie man das behebt?[self setModalPresentationStyle:UIModalPresentationCurrentContext];
nicht alleine. Man muss[self.navigationController setModalPresentationStyle:UIModalPresentationCurrentContext];
auch wie in Ihrem Demo-Projekt abgebildet verwenden.Modale Popups im Interface Builder (Storyboards)
Schritt 1
Machen Sie auf dem ViewController, den Sie als modales Popup verwenden möchten, die Hintergrundfarbe des Root-UIView klar. Tipp: Verwenden Sie das Root-UIView nicht als Popup. Fügen Sie eine neue UIView hinzu, die kleiner ist als Ihr Popup.
Schritt 2
Erstellen Sie einen Segue zum ViewController mit Ihrem Popup. Wählen Sie "Modal präsentieren".
Zwei Methoden zum Erstellen eines Popups von hier aus
Methode Eins - Verwenden des Segue
Wählen Sie den Segue aus und ändern Sie die Präsentation in "Über den aktuellen Kontext":
Methode 2 - Verwenden des View Controllers
Wählen Sie die ViewController-Szene aus, die Ihr Popup ist. Setzen Sie im Attributes Inspector im Abschnitt View Controller die Option Presentation auf "Over Current Context": Over Current Context:
Beide Methoden funktionieren. Das sollte es tun!
quelle
Sie können dies im Interface Builder tun.
quelle
Fühlen Sie sich frei, meinen Formularblatt-Controller MZFormSheetController für iPhone zu verwenden. In einem Beispielprojekt gibt es viele Beispiele für die Darstellung eines Modal View Controllers, der nicht das gesamte Fenster abdeckt und viele Präsentations- / Übergangsstile aufweist.
Sie können auch neueste Version von MZFormSheetController versuchen , die aufgerufen wird MZFormSheetPresentationController und haben viel mehr Funktionen.
quelle
Sie können EzPopup ( https://github.com/huynguyencong/EzPopup ) verwenden. Es ist ein Swift-Pod und sehr einfach zu bedienen:
// init YourViewController let contentVC = ... // Init popup view controller with content is your content view controller let popupVC = PopupViewController(contentController: contentVC, popupWidth: 100, popupHeight: 200) // show it by call present(_ , animated:) method from a current UIViewController present(popupVC, animated: true)
quelle
Imao UIImageView auf Hintergrund zu setzen ist nicht die beste Idee. In meinem Fall habe ich in der Controller-Ansicht weitere 2 Ansichten hinzugefügt. Die erste Ansicht hat
[UIColor clearColor]
Hintergrund, die zweite Farbe, die transparent sein soll (in meinem Fall grau). Beachten Sie, dass die Reihenfolge wichtig ist. Stellen Sie dann für die zweite Ansicht Alpha 0,5 (Alpha> = 0 <= 1) ein. Fügen Sie dies zu den Zeilen hinzuprepareForSegue
infoVC.providesPresentationContextTransitionStyle = YES; infoVC.definesPresentationContext = YES;
Und das ist alles.
quelle
Swift 4:
So fügen Sie eine Überlagerung oder die Popup-Ansicht hinzu Sie können auch die Container-Ansicht verwenden, mit der Sie einen kostenlosen View Controller erhalten (Sie erhalten die Container-Ansicht aus der üblichen Objektpalette / Bibliothek).
Schritte:
Haben Sie eine Ansicht (ViewForContainer im Bild), die diese Containeransicht enthält, um sie zu dimmen, wenn der Inhalt der Containeransicht angezeigt wird. Schließen Sie die Steckdose im ersten View Controller an
Blenden Sie diese Ansicht aus, wenn 1st VC geladen wird
Einblenden, wenn auf die Schaltfläche geklickt wird
Um diese Ansicht zu verkleinern, wenn der Inhalt der Containeransicht angezeigt wird, setzen Sie den Hintergrund der Ansichten auf Schwarz und die Deckkraft auf 30%
Sie erhalten diesen Effekt, wenn Sie auf die Schaltfläche klicken
quelle
Sie können dies tun, um dem Ansichts-Controller eine andere Unteransicht hinzuzufügen. Setzen Sie zunächst die Statusleiste für den ViewController, den Sie als Unteransicht hinzufügen möchten, auf Keine, damit Sie die Größe auf die gewünschte Größe ändern können. Erstellen Sie dann eine Schaltfläche im Present View-Controller und eine Methode zum Klicken auf eine Schaltfläche. In der Methode:
- (IBAction)btnLogin:(id)sender { SubView *sub = [[SubView alloc] initWithNibName:@"SubView" bundle:nil]; sub.view.frame = CGRectMake(20, 100, sub.view.frame.size.width, sub.view.frame.size.height); [self.view addSubview:sub.view]; }
Hoffe das hilft, zögern Sie nicht zu fragen, wenn Sie Fragen haben ...
quelle