W iOS 13 pojawiło się nowe zachowanie dla kontrolera widoku modalnego podczas prezentacji.
Teraz domyślnie nie jest pełnoekranowy, a kiedy próbuję zjechać w dół, aplikacja po prostu automatycznie wyłącza kontroler widoku.
Jak mogę temu zapobiec i wrócić do starego pełnoekranowego modalnego vc?
Dzięki
ios
viewcontroller
modalviewcontroller
ios13
pascalbros
źródło
źródło
fullScreen
Opcja powinna być domyślnie zapobiec zerwaniu zmiany UI.isModalInPresentation
aby zablokować gest machnięcia przed odrzuceniem. Zobacz mój post na blogu, aby uzyskać więcej informacji: medium.com/@hacknicity/….automatic
styl ustabilizował się jako domyślny, czyli.pageSheet
styl (dla większości kontrolerów widoków) . Jednak niektóre kontrolery widoku systemu mogą odwzorować go na inny styl.Dodaję informacje, które mogą być przydatne dla kogoś. Jeśli masz jakiś segment scenorysu, aby powrócić do starego stylu, musisz ustawić właściwość kind na Present Modally, a właściwość Presentation na pełny ekran .
źródło
performSegue
. Dzięki, kochanie!Miałem ten problem w początkowym widoku zaraz po ekranie uruchamiania. Rozwiązaniem dla mnie, ponieważ nie miałem zdefiniowanego segmentu ani logiki, było przełączenie prezentacji z automatycznej na pełnoekranową, jak pokazano tutaj:
źródło
Można to zrobić na wiele sposobów i myślę, że każdy może pasować do jednego projektu, ale nie do innego, więc pomyślałem, że zatrzymam je tutaj, może ktoś inny wybiegnie w inną sprawę.
1- Zastąp obecny
Jeśli masz
BaseViewController
, możesz zastąpićpresent(_ viewControllerToPresent: animated flag: completion:)
metodę.W ten sposób nie musisz wprowadzać żadnych zmian w żadnym
present
wywołaniu, ponieważ po prostu przesłoniliśmypresent
metodę.2- Rozszerzenie:
Stosowanie:
3- Dla jednego UIViewController
4- Z Storyboard
Wybierz segue i ustaw prezentację na
FullScreen
.5- Swizzling
Zastosowanie:
W swoim
AppDelegate
wnętrzuapplication(_ application: didFinishLaunchingWithOptions)
dodaj ten wiersz:W ten sposób nie musisz wprowadzać żadnych zmian w żadnym bieżącym wywołaniu, ponieważ zastępujemy obecną implementację metody w środowisku wykonawczym.
Jeśli chcesz wiedzieć, co jest zawrotne, możesz sprawdzić ten link: https://nshipster.com/swift-objc-runtime/
źródło
Użyłem swizzlinga dla iOS 13
następnie połóż to
gdzieś
na przykład w AppDelegate
źródło
static let
jest leniwy, musisz go przeczytać, aby pozwolić mu być obliczonym, leniwy var obliczony tylko raz, używam go, aby mieć gwarancję, że swizzling zadzwonił razDla użytkowników celu C
Po prostu użyj tego kodu
Lub jeśli chcesz dodać go konkretnie w iOS 13.0, użyj
źródło
Jedna wkładka:
modalPresentationStyle
należy ustawić w nawigatorze, który jest prezentowany .Testowany kod
modalPresentationStyle wymagają ustawienia w navigationController .
źródło
Jako wskazówka: Jeśli zadzwonisz na obecny,
ViewController
który jest osadzony w środkuNavigationController
, musisz ustawićNavigationController
na.fullScreen
i nie VC.Możesz to zrobić jak @davidbates lub zrobić to programowo (jak @pascalbros).
Przykładowy scenariusz:
źródło
Musiałem zrobić oba:
Ustaw styl prezentacji na Pełny ekran
Ustaw górny pasek jako półprzezroczysty pasek nawigacyjny
źródło
Zmień
modalPresentationStyle
przed przedstawieniemźródło
Oto proste rozwiązanie bez kodowania jednej linii.
Ta zmiana powoduje, że zachowanie aplikacji na iPada jest zgodne z oczekiwaniami, w przeciwnym razie nowy ekran będzie wyświetlany na środku ekranu jako wyskakujące okienko.
źródło
Jeśli masz UITabController z ekranami z wbudowanymi kontrolerami nawigacji, musisz ustawić Prezentację UITabController na FullScreen, jak pokazano na poniższym obrazku
źródło
Oto rozwiązanie dla Objective-C
źródło
Najnowsze na iOS 13 i Swift 5.x
źródło
Oto moja wersja poprawki w ObjectiveC przy użyciu kategorii. Dzięki takiemu podejściu będziesz mieć domyślne zachowanie UIModalPresentationStyleFullScreen, dopóki inne nie zostanie wyraźnie ustawione.
źródło
Wszystkie pozostałe odpowiedzi są wystarczające, ale w przypadku dużego projektu, takiego jak nasz i gdzie nawigacja odbywa się zarówno w kodzie, jak i scenorysie, jest to dość trudne zadanie.
Dla tych, którzy aktywnie korzystają z Storyboard. Oto moja rada: skorzystaj z Regex.
Poniższy format nie jest odpowiedni dla stron pełnoekranowych:
Poniższy format jest odpowiedni dla stron pełnoekranowych:
Poniższe wyrażenie regularne zgodne z VS CODE przekonwertuje wszystkie strony w starym stylu na strony w nowym stylu. Może być konieczne uniknięcie specjalnych znaków, jeśli używasz innych silników wyrażeń regularnych / edytorów tekstu.
Wyszukaj Regex
Wymień Regex
źródło
Początkowo wartością domyślną jest
fullscreen
modalPresentationStyle, ale w iOS 13 jego zmiany dotycząUIModalPresentationStyle.automatic
.Jeśli chcesz zrobić kontroler widoku pełnoekranowego, musisz zmienić
modalPresentationStyle
nafullScreen
.Zapoznaj się z
UIModalPresentationStyle
dokumentacją firmy Apple, aby uzyskać więcej szczegółów, i zapoznaj się z wytycznymi dotyczącymi interfejsu Apple Apple, gdzie należy użyć jakiej modalności.źródło
Możesz to łatwo otworzyć Otwórz scenorys jako kod źródłowy i wyszukaj
kind="presentation"
we wszystkich tagach seague z kind = prezentacja dodaj dodatkowy atrybutmodalPresentationStyle="fullScreen"
źródło
// jeśli chcesz wyłączyć przesunięcie, aby je odrzucić, dodaj linię
Sprawdź dokument Apple, aby uzyskać więcej informacji.
źródło
Osiągnąłem to, używając metody swizzling (Swift 4.2):
Aby utworzyć rozszerzenie UIViewController w następujący sposób
oraz w AppDelegate, w aplikacji: didFinishLaunchingWithOptions: wywołaj swizzling kod, wywołując:
źródło
To działało dla mnie:
yourViewController.modalPresentationStyle = UIModalPresentationStyle.fullScreen
źródło
Utwórz kategorię dla UIViewController (powiedz UIViewController + PresentationStyle). Dodaj do niego następujący kod.
źródło
alternatywnym podejściem jest posiadanie własnego komponentu podstawowego kontrolera widoku w aplikacji i po prostu implementacja wyznaczonych i wymaganych inicjatorów z podstawową konfiguracją, coś takiego:
UWAGA : Jeśli twój kontroler widoku jest zawarty w kontrolerze nawigacyjnym, który jest faktycznie prezentowany modalnie, to kontroler nawigacyjny powinien podejść do problemu w ten sam sposób (co oznacza, że dostosujesz niestandardowy komponent kontrolera nawigacji w ten sam sposób
Testowane na Xcode 11.1 na iOS 13.1 i iOS 12.4
Mam nadzieję, że to pomoże
źródło
Miałem ten problem z filmem, który nie wyświetla już pełnego ekranu. Dodano tę linię, która uratowała dzień :-)
źródło
Najprostsze rozwiązanie, które działało dla mnie.
źródło
Jeśli korzystasz z UINavigationController i osadzasz ViewController jako główny kontroler widoku, to i ty miałbyś problem z tym samym problemem. Aby pokonać, użyj następującego kodu.
źródło
Zamiast wywoływać
self.modalPresentationStyle = .fullScreen
dla każdego kontrolera widoku, możesz podklasować UIViewController i używać goMyViewController
wszędzie.źródło
Powyższe odpowiedzi i sugestie są słuszne, poniżej jest kolejna wersja i skuteczny sposób korzystania programowo.
# 1 Utworzono rozszerzenie UIView
# 2 Utworzono metodę ()
Wywoływanie jak poniżej
LUB
źródło