Wyświetlanie UIViewController jako Popup w iPhone

ponieważ nie ma kompletnej, ostatecznej odpowiedzi na to częste powtarzające się pytanie, zadam i odpowiem tutaj.

Często musimy przedstawić UIViewController tak, aby nie obejmował on pełnego ekranu, jak na poniższym obrazku.

Tutaj wpisz opis obrazka

Apple udostępnia kilka podobnych UIViewController, takich jak UIAlertView, Twitter lub Facebook share view controller itp..

Jak możemy osiągnąć ten efekt dla niestandardowego kontrolera?

Author: Kheldar, 2013-04-26

8 answers

UWAGA : To rozwiązanie jest zepsute w systemie iOS 8. Opublikuję nowe rozwiązanie JAK NAJSZYBCIEJ.

Zamierzam odpowiedzieć tutaj za pomocą storyboardu, ale jest to również możliwe bez storyboardu.

  1. INIT: utwórz dwa UIViewController w storyboardzie.

    • powiedzmy FirstViewController który jest normalny i {[4] } który będzie wyskakującym okienkiem.

  2. Modal Segue: umieść UIButton W FirstViewController i utwórz segue na tym UIButton aby SecondViewController jako segment modalny.

  3. Make Transparent: teraz wybierz UIView (UIView który jest tworzony domyślnie z UIViewController) z SecondViewController i zmienia jego kolor tła na jasny kolor.

  4. Przyciemnij Tło: Dodaj UIImageView W SecondViewController, który obejmuje cały ekran i ustawia jego obraz na jakiś przyciemniony półprzezroczysty obraz. Możesz pobrać próbkę stąd : UIAlertView obraz tła

  5. Projekt wyświetlacza: teraz dodaj UIView i wykonaj dowolny projekt, który chcesz pokazać. Oto zrzut ekranu z mojego storyboardu storyboard

    • tutaj mam dodać segue na przycisk logowania, który otwiera SecondViewController jako popup, aby zapytać nazwę użytkownika i hasło
  6. Ważne: teraz ten główny krok. Chcemy, aby SecondViewController nie ukrywał całkowicie kontrolera FirstViewController. Ustawiliśmy jasny kolor, ale to nie wystarczy. Domyślnie dodaje Czarny za prezentacją modelu, więc musimy dodać jedną linijkę kodu w viewDidLoad z dnia FirstViewController. Można go dodać w innym miejscu również, ale powinien działać przed segue.

    [self setModalPresentationStyle:UIModalPresentationCurrentContext];

  7. Odrzucenie: kiedy odrzucić zależy od Twojego przypadku użycia. Jest to prezentacja modalna, więc aby odrzucić robimy to, co robimy dla prezentacji modalnej: {]}

    [self dismissViewControllerAnimated:YES completion:Nil];

To wszystko.....

Wszelkie sugestie i komentarze są mile widziane.

Demo: Możesz pobrać projekt źródła demo tutaj: Popup Demo

Nowy : ktoś wykonał bardzo dobrą robotę przy tej koncepcji: MZFormSheetController
nowy : znalazłem jeszcze jeden kod do uzyskania tego rodzaju funkcji: KLCPopup


Aktualizacja IOS 8: zrobiłem tę metodę do pracy z iOS 7 i iOS 8

+ (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];
    }
}

Można użyć tej metody wewnątrz preparedforsegue deligate w ten sposób

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {

    PopUpViewController *popup = segue.destinationViewController;
    [self setPresentationStyleForSelfController:self presentingController:popup]
}
 94
Author: CRDave,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-09 11:31:17

Modalne wyskakujące okienka w interfejsie Buildera (storyboardy)

Krok 1

W kontrolerze ViewController, który ma być modalnym wyskakującym okienkiem, Wyczyść kolor tła głównego UIView. Ustaw jasny kolor w widoku głównym Wskazówka: nie używaj Root UIView jako wyskakującego okienka. Dodaj nowy widok UIView, który jest mniejszy, aby był twoim wyskakującym okienkiem.

Krok 2

Utwórz Segue do kontrolera ViewController, który ma twoje wyskakujące okienko. Wybierz "Prezentuj Modalnie". Segue

Dwie Metody Tworzenia Popup Z Tutaj

Metoda pierwsza-użycie Segue

Wybierz Segue i zmień prezentację na " Over Current Context": Over Current Context

Metoda druga-użycie kontrolera widoku

Wybierz scenę ViewController, która jest Twoim wyskakującym okienkiem. W Inspektorze atrybutów, w sekcji Widok Kontroler, Ustaw prezentację na " Over Current Context": ViewController

Każda metoda zadziała. To powinno wystarczyć!

Produkt Końcowy

 37
Author: Mark Moeykens,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-04 16:36:45

Możesz to zrobić w Interface Builder.

  • dla widoku, który chcesz zaprezentować modalnie ustaw jego zewnętrzne tło widoku na przezroczyste
  • Control + click and drag from the host view controller to the modal view controller
  • Wybierz prezent modalnie
  • Kliknij na nowo utworzony segue i w Inspektorze atrybutu (po prawej) Ustaw "Presentation " NA"Over Current Context"
 13
Author: Sig,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-25 00:52:56

Zapraszam do skorzystania z mojego kontrolera arkusza formularzy MZFormSheetController dla iPhone ' a, w przykładowym projekcie jest wiele przykładów jak zaprezentować kontroler widoku modalnego, który nie będzie obejmował pełnego okna i ma wiele stylów prezentacji/przejścia.

Możesz również wypróbować najnowszą wersję MZFormSheetController, która nazywa się MZFormSheetPresentationController i ma dużo więcej funkcji.

 10
Author: mientus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-06 07:20:32

Możesz użyć EzPopup ( https://github.com/huynguyencong/EzPopup ), jest to szybki pod i bardzo łatwy w użyciu:

// 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)
 2
Author: huync,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-06 05:12:05

Możesz to zrobić, aby dodać dowolny inny podgląd do kontrolera widoku. Najpierw ustaw pasek stanu na brak dla kontrolera ViewController, który chcesz dodać jako subview, aby można było zmienić rozmiar na dowolny. Następnie Utwórz przycisk w bieżącym kontrolerze widoku i metodę kliknięcia przycisku. W metodzie:

- (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];
}

Mam nadzieję, że to pomoże, nie krępuj się zapytać, jeśli jakieś pytania...

 1
Author: User-1070892,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-09 15:03:41

Imao umieścić UIImageView w tle nie jest najlepszym pomysłem . W moim przypadku dodałem na kontrolerze widok inne 2 widoki . Pierwszy widok Ma [UIColor clearColor] na tle, drugi-kolor, który chcesz być przezroczysty (szary w moim przypadku).Pamiętaj, że kolejność jest ważna.Następnie dla drugiego widoku Ustaw alpha 0.5 (alpha >=0 prepareForSegue

infoVC.providesPresentationContextTransitionStyle = YES;
infoVC.definesPresentationContext = YES;
I to wszystko.
 1
Author: Bohdan Savych,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-04 13:47:51

Swift 4:

Aby dodać nakładkę lub widok popup Można również użyć widoku kontenera , za pomocą którego otrzymuje się darmowy kontroler widoku (Widok kontenera otrzymuje się ze zwykłej palety obiektów / biblioteki)

Tutaj wpisz opis obrazka

Kroki:

  1. Mieć Widok (ViewForContainer na zdjęciu), który przechowuje ten widok kontenera, aby go przyciemnić, gdy wyświetlana jest zawartość widoku kontenera. Podłącz gniazdko wewnątrz pierwszego widoku Controller

  2. Ukryj ten Widok po wczytaniu pierwszego VC

  3. Odkryj, gdy przycisk jest kliknięty Tutaj wpisz opis obrazka

  4. Aby przyciemnić ten Widok, gdy wyświetlana jest zawartość widoku kontenera, Ustaw tło widoków na czarne, a krycie na 30%

Tutaj wpisz opis obrazka

Uzyskasz ten efekt po kliknięciu na przycisk Tutaj wpisz opis obrazka

 0
Author: Naishta,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-09 09:15:38