Próbuję przedstawić kontroler widoku modalnie, z przezroczystym tłem. Moim celem jest jednoczesne wyświetlanie widoku kontrolerów widoku prezentującego i prezentowanego. Problem polega na tym, że po zakończeniu animacji prezentacji widok kontrolera widoku prezentacji znika.
- (IBAction)pushModalViewControllerButtonPressed:(id)sender
{
ModalViewController *modalVC = [[ModalViewController alloc] init];
[self presentViewController:modalVC animated:YES completion:nil];
}
Wiem, że mógłbym po prostu dodać widok jako widok podrzędny, ale z jakiegoś powodu chciałbym uniknąć tego rozwiązania. Jak mogę to naprawić?
Odpowiedzi:
Poniższy kod działa tylko na iPadzie.
Chciałbym dodać widok podrzędny.
Oto bardzo dobra dyskusja. Spójrz na komentarze. Nie tylko odpowiedź.
Widok modalny
Gdybym był tobą, nie zrobiłbym tego. Chciałbym dodać widok podrzędny i zrobić to. Wydaje się, że daje mi lepszą kontrolę nad rzeczami.
EDYTOWAĆ:
Jak wspomniał Paul Linsay, od iOS 8 wszystko, czego potrzeba, to
UIModalPresentationOverFullScreen
moduł modalPresentationStyle ViewController. Dotyczy to również przycisków nawigacji i paska narzędzi.źródło
modalPresentationStyle = UIModalPresentationCurrentContext
na prezentera widoku kontrolera, a nie w prezentowanym jeden.ViewController
hierarchii widoków. (np. aNavigationController
lub instancja kontrolera widoku menu slajdów, na przykład).UIModalPresentationCustom
i tylko wtedy, gdy zostało ustawione tuż przed,presentViewController
a nie wviewDidLoad
.modalPresentationStyle
wcześniejviewDidLoad
ustawić . Zrobiłem to w konstruktorze i zadziałało.Dla tych, którzy próbują uzyskać to do pracy w iOS 8, „Apple-zatwierdzone” sposobem wyświetlania przejrzystego modalne kontroler widoku jest poprzez ustawienie
modalPresentationStyle
na obecnym ed kontrolera doUIModalPresentationOverCurrentContext
.Można to zrobić w kodzie lub ustawiając właściwości segue w serii ujęć.
Z dokumentacji UIViewController:
https://developer.apple.com/documentation/uikit/uiviewcontroller
Film „Zobacz postępy kontrolera w iOS 8” z WWDC 2014 opisuje to szczegółowo.
Uwaga:
viewDidLoad
prezentowanymViewController nie będzie miało żadnego wpływuźródło
sourceVC
jestself.navigationController
. Ponadto dopiero po ustawieniu docelowego stylu prezentacji jako niestandardowego mogłem go przejrzeć.[sourceVC setModalPresentationStyle:UIModalPresentationCurrentContext];
,[targetVC setModalPresentationStyle:UIModalPresentationCustom];
Mam nadzieję , że to komuś pomoże.presentedVC.modalPresentationStyle = UIModalPresentationOverCurrentContext
w prezentowaniu VC. Nie działa w prezentowanym PCV. Zaufaj mi, próbowałem.W systemie iOS 8.0 i nowszym można to zrobić, ustawiając właściwość modalPresentationStyle na UIModalPresentationOverCurrentContext
źródło
.custom
i.overFullScreen
działa..overFullScreen
obecny kontroler widokuviewWillAppear
nie będzie wywoływany.presentedController.view.backgroundColor = #color#
powinno być napisane wpresentedController
'sviewDidLoad
, albopresentedController
jest życie zostaje przerwane.Ten kod działa poprawnie na telefonie iPhone w systemie iOS6 i iOS7:
W takim przypadku brakuje Ci animacji wsuwania. Aby zachować animację, nadal możesz użyć następującego „nie-eleganckiego” rozszerzenia:
Jeśli nasza prezentacjaV znajduje się w UINavigationController lub UITabbarController, musisz współpracować z tymi kontrolerami jako prezentingVC.
Ponadto w iOS7 można zaimplementować niestandardowy
UIViewControllerTransitioningDelegate
protokół animacji przejścia . Oczywiście w tym przypadku można uzyskać przezroczyste tłoPo pierwsze, przed prezentacją musisz ustawić
modalPresentationStyle
Następnie musisz zaimplementować dwie metody protokołu
Ostatnią rzeczą jest zdefiniowanie niestandardowego przejścia w
CustomAnimatedTransitioning
klasieźródło
modalPresentationStyle
jest również ustawiony!Zmagałem się trochę z Konstruktorem interfejsów XCode 7, aby ustawić styl prezentacji zgodnie z sugestią @VenuGopalTewari. W tej wersji wydaje się, że nie ma trybu prezentacji
Over Current Context
aniOver Full Screen
trybu prezentacji. Aby więc działało, ustawiam tryb naDefault
:z
Dodatkowo ustawiam tryb prezentacji kontrolera widoku prezentowanego modalnie na
Over Full Screen
:źródło
Utwórz segment, aby modalnie prezentować i ustaw właściwość prezentacji tego segmentu na ponad bieżący kontekst, będzie działać w 100%
źródło
PresentViewController z przezroczystym tłem - w iOS 8 i iOS 9
A w MYViewController ustaw kolor tła na czarny i zmniejsz krycie
źródło
To trochę hacky sposób, ale dla mnie ten kod działa (iOS 6):
Ten kod działa również na iPhonie
źródło
Ta kategoria działała dla mnie (iOS 7, 8 i 9)
Plik H.
Plik M.
źródło
Rozwiązanie tej odpowiedzi przy użyciu szybkiego byłoby następujące.
źródło
Jeśli używasz Storyboard, możesz wykonać ten krok:
źródło
Dodałem te trzy linie do metody init w prezentowanym kontrolerze widoku i działa jak urok:
EDYCJA (działa na iOS 9.3):
Zgodnie z dokumentacją:
Dostępne w iOS 8.0 i nowszych.
źródło
Alternatywnym sposobem jest użycie „widoku kontenera”. Po prostu zrób alfa poniżej 1 i umieść w nim seque. XCode 5, docelowy iOS7. Testowane na iPhonie.
Widok kontenera dostępny z iOS6. Link do postu na blogu na ten temat.
źródło
Stworzyłem obiekt do obsługi prezentacji tego, co nazywam „nałożonym modalem”, co oznacza, że zachowuje widok tła i pozwala mieć modal z przezroczystym tłem.
Ma jedną, prostą metodę, która robi to:
Ważne jest, aby ustawić
modalPresentationCapturesStatusBarAppearance
właściwośćYES
i wymusić aktualizację wyglądu paska stanu, jeśli prezentowany kontroler widoku ma innypreferredStatusBarStyle
.Ten obiekt powinien mieć
@property (assign, nonatommic) isPresenting
Chcesz ten przedmiot do wykonania do
UIViewControllerAnimatedTransitioning
iUIViewControllerTransitioningDelegate
protokołów i wdrożyć następujące metody:i:
Robi to animację wsuwania z dołu naśladującą domyślną animację modalną, ale możesz zrobić to, co chcesz.
Ważne jest to, że widok kontrolera widoku prezentującego pozostanie z tyłu, umożliwiając stworzenie przezroczystego efektu.
To rozwiązanie działa na iOS 7+
źródło
Bardzo prostym sposobem na zrobienie tego (
Storyboards
na przykład za pomocą ) jest:Pozwoli to przedstawić
UIViewController
wStoryboard
modally, ale z półprzezroczystym tle.źródło
Działa na iOS 7-10
źródło
Aby podsumować wszystkie dobre odpowiedzi i komentarze tutaj i nadal mieć animację podczas przechodzenia do nowej,
ViewController
oto co zrobiłem: (Obsługuje iOS 6 i nowsze wersje)Jeśli używasz
UINavigationController
\,UITabBarController
jest to właściwy sposób:Jeśli to zrobisz, stracisz
modalTransitionStyle
animację. Aby go rozwiązać, możesz łatwo dodać do swojejSomeViewController
klasy:źródło
Oczywiście powinieneś ustawić UIModalPresentationCurrentContext, ale miejsce ustawienia clearColor jest również bardzo ważne! Nie można ustawić tła w funkcji viewDidLoad, ustawić go przed załadowaniem widoku, tak jak w kontrolerze widoku głównego lub w funkcji init kontrolera, który ma się pojawić!
lub
źródło
Jeśli używasz modalnego segue, ustaw go jako ten obraz (możesz wyłączyć animację, jeśli chcesz)
źródło
Kompletna metoda przetestowana na iOS 7 i iOS 8.
źródło
Szybki 4.2
źródło
w appdelegate:
w pierwszym widoku kontrolera, z którego należy załadować następny widok:
w twoim nextViewController, który należy dodać przezroczysty:
źródło
Musimy poprawnie ustawić nasz Modal.
docelowy link do obrazu
Najpierw musimy zmienić tło widoku kontrolera widoku na Wyczyść kolor. Oznacza to po prostu, że powinien być przejrzysty. Domyślnie ten widok jest biały.
Po drugie, musimy wybrać Segment, który prowadzi do ekranu logowania, a następnie w Inspektorze atrybutów ustawić Prezentację na Ponad bieżący kontekst. Ta opcja jest dostępna tylko z włączonym automatycznym układem i klasami wielkości.
docelowy link do obrazu
źródło
Ustaw nawigację
modalPresentationStyle
naUIModalPresentationCustom
i ustaw kolor tła kontrolera widoku jako przezroczysty.
źródło