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.
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?
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.
-
INIT: utwórz dwa
UIViewController
w storyboardzie.- powiedzmy
FirstViewController
który jest normalny i {[4] } który będzie wyskakującym okienkiem.
- powiedzmy
Modal Segue: umieść
UIButton
W FirstViewController i utwórz segue na tymUIButton
abySecondViewController
jako segment modalny.Make Transparent: teraz wybierz
UIView
(UIView
który jest tworzony domyślnie zUIViewController
) zSecondViewController
i zmienia jego kolor tła na jasny kolor.Przyciemnij Tło: Dodaj
UIImageView
WSecondViewController
, 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-
Projekt wyświetlacza: teraz dodaj
UIView
i wykonaj dowolny projekt, który chcesz pokazać. Oto zrzut ekranu z mojego storyboardu- tutaj mam dodać segue na przycisk logowania, który otwiera
SecondViewController
jako popup, aby zapytać nazwę użytkownika i hasło
- tutaj mam dodać segue na przycisk logowania, który otwiera
-
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 dniaFirstViewController
. Można go dodać w innym miejscu również, ale powinien działać przed segue.[self setModalPresentationStyle:UIModalPresentationCurrentContext];
-
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];
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]
}
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. 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".
Dwie Metody Tworzenia Popup Z Tutaj
Metoda pierwsza-użycie Segue
Wybierz Segue i zmień prezentację na " 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":
Każda metoda zadziała. To powinno wystarczyć!
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"
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.
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)
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...
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.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)
Kroki:
-
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
-
Ukryj ten Widok po wczytaniu pierwszego VC
Aby przyciemnić ten Widok, gdy wyświetlana jest zawartość widoku kontenera, Ustaw tło widoków na czarne, a krycie na 30%
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