Zeigen Sie UIViewController als Popup im iPhone an

75

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 UIViewControllerso präsentieren, dass sie nicht den gesamten Bildschirm abdeckt, wie im Bild unten.

Geben Sie hier die Bildbeschreibung ein

Apple bietet verschiedene ähnliche Funktionen an UIViewController, z. B. UIAlertViewTwitter oder Facebook Share View Controller usw.

Wie können wir diesen Effekt für einen benutzerdefinierten Controller erzielen?

CRDave
quelle
10
Bitte kommentieren Sie, warum Sie nicht gewählt haben, damit ich mich verbessern kann.
CRDave
Ich würde Ihnen empfehlen, STPopup zu verwenden. Verwenden Sie es genau wie UINavigationController.
Kevin
Ich fand diesen Pod gut: github.com/huynguyencong/EzPopup
huync

Antworten:

95

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.

  1. Init: Erstellen Sie zwei UIViewControllerim Storyboard.

    • Nehmen wir an, FirstViewControllerwas normal ist und SecondViewControllerwelches das Popup sein wird.

  2. Modal Segue: Setzen Sie UIButtonin FirstViewController und Segue auf diese erstellen UIButtonzu SecondViewControllermodal segue.

  3. Transparent machen: Wählen Sie nun UIView( UIViewdie standardmäßig mit erstellt wird UIViewController) von SecondViewControllerund ändern Sie die Hintergrundfarbe in klare Farbe.

  4. Machen Hintergrund Dim: Fügen Sie ein UIImageViewin SecondViewControllerder ganzen Bildschirm ausfüllt und setzt sein Bild bis zu einem gewissen gedimmt halbtransparentes Bild. Ein Beispiel erhalten Sie hier: UIAlertViewHintergrundbild

  5. Display-Design: Fügen Sie nun ein Design hinzu UIViewund erstellen Sie ein beliebiges Design, das Sie anzeigen möchten. Hier ist ein Screenshot meines Storyboards Storyboard

    • Hier habe ich eine Schaltfläche zum Anmelden hinzugefügt, die SecondViewControllerals Popup geöffnet wird , um nach Benutzername und Passwort zu fragen
  6. Wichtig: Nun zum Hauptschritt. Wir möchten, dass SecondViewControllerFirstViewController 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 muss FirstViewController. Sie können es auch an einer anderen Stelle hinzufügen, es sollte jedoch vor dem Übergang ausgeführt werden.

    [self setModalPresentationStyle:UIModalPresentationCurrentContext];

  7. 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


iOS 8-Update : Ich habe diese Methode für iOS 7 und iOS 8 entwickelt

+ (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]
}
CRDave
quelle
1
Die Einstellung [self setModalPresentationStyle:UIModalPresentationCurrentContext];scheint die Modalübergangsanimation ( UIModalTransitionStyleCrossDissolvezum Beispiel) beim Präsentieren des Second View Controllers zu unterbrechen, sodass sie nur ohne Animation angezeigt wird. Irgendwelche Gedanken, wie man das behebt?
Filwag
@cevitcejbo Vielen Dank für einen Blick. auf segue, wenn wir die Übergangseigenschaft auf eine setzen, die eine Animation liefert, aber nur, wenn sie nicht angezeigt wird. Bis ich nicht weiß, wie ich es lösen soll. Ich bearbeite meine Antwort, wenn ich finde. Wenn Sie diese Bitte finden, informieren Sie mich.
CRDave
5
@CRDave funktioniert, wie Sie oben vorgeschlagen haben, [self setModalPresentationStyle:UIModalPresentationCurrentContext];nicht alleine. Man muss [self.navigationController setModalPresentationStyle:UIModalPresentationCurrentContext];auch wie in Ihrem Demo-Projekt abgebildet verwenden.
Vasu
@Kailash Ja, Sie haben Recht, wenn Sie Navigationscontroller verwendet haben, als es erforderlich ist. Ich habe es hier geschrieben: github.com/Chintan-Dave/popupDemo/issues/1 . Danke, dass du es hier hinzufügst.
CRDave
Wie ändere ich das Rechteck des Popups?
Govind
50

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. Stellen Sie in der Stammansicht die Option "Farbe löschen" ein 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". Übergang

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": Ü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: ViewController

Beide Methoden funktionieren. Das sollte es tun!

Fertiges Produkt

Mark Moeykens
quelle
Hier ist ein bisschen mehr Hilfe, wenn ich kann: Erstellen Sie eine Viewcontroller-Klasse in Ihrem Code irgendwo wie MyDialog: UIViewController. Legen Sie es als benutzerdefinierte Klasse des neuen Viewcontrollers im Storyboard fest. Fügen Sie Schaltflächen usw. ein und verbinden Sie sie mit Strg + Ziehen mit Ihrem Code. Anruf abweisen (animiert, Abschluss) auf Knopfdruck.
Numan Karaaslan
1
Das ist großartig. Danke
Im Batman
13

Sie können dies im Interface Builder tun.

  • Stellen Sie für die Ansicht, die Sie modal darstellen möchten, den Hintergrund der äußersten Ansicht auf transparent ein
  • Strg + Klicken und Ziehen vom Host View Controller zum Modal View Controller
  • Wählen Sie das Geschenk modal aus
  • Klicken Sie auf den neu erstellten Abschnitt und setzen Sie im Attributinspektor (rechts) "Präsentation" auf "Über aktuellen Kontext".
Sig
quelle
10

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.

Michal Zaborowski
quelle
Dieser Formularblatt-Controller sieht großartig aus. Das einzige Problem ist, wenn ich den modalen Vollbild-Ansichts-Controller präsentiere und ihn dann entlasse. Der Formularblatt-Controller wird ebenfalls Vollbild. Bitte helfen Sie
Mazen Kasser
Sie müssen diesen praktischen Code nicht gefunden haben;) // Um ​​MZFormSheetController zu präsentieren * formSheet = [[MZFormSheetController alloc] initWithViewController: controller]; [formSheet presentAnimated: YES finishHandler: nil]; // MZFormSheetController schließen * controller = self.navigationController.formSheetController; [controller EntlassungFormSheetControllerAnimated: YES VervollständigungHandler: Null];
Mazen Kasser
2

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)
huync
quelle
1

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.

Bohdan Savych
quelle
1

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).

Geben Sie hier die Bildbeschreibung ein

Schritte:

  1. 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

  2. Blenden Sie diese Ansicht aus, wenn 1st VC geladen wird

  3. Einblenden, wenn auf die Schaltfläche geklickt wird Geben Sie hier die Bildbeschreibung ein

  4. 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%

Geben Sie hier die Bildbeschreibung ein

Sie erhalten diesen Effekt, wenn Sie auf die Schaltfläche klicken Geben Sie hier die Bildbeschreibung ein

Naishta
quelle
0

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 ...

User-1070892
quelle
Hier ist SubView ist ein UIViewController mit xib-Schnittstelle, keine
Unteransicht
OK, ich war mir auf diese Weise nicht bewusst. Vielen Dank.
CRDave