Prezentacja modalu w iOS 13 na pełnym ekranie


464

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?

zachowanie modalne

Dzięki

Odpowiedzi:


622

Z iOS 13, jak stwierdzono w Platforms State of the Union podczas WWDC 2019, Apple wprowadził nową domyślną prezentację kart. Aby wymusić pełny ekran, musisz to wyraźnie określić za pomocą:

let vc = UIViewController()
vc.modalPresentationStyle = .fullScreen //or .overFullScreen for transparency
self.present(vc, animated: true, completion: nil)

81
Powiedziałbym, że to nie pozostanie długo jako domyślne. fullScreenOpcja powinna być domyślnie zapobiec zerwaniu zmiany UI.
Jakub Truhlář

17
Nie będę na to liczyć. W przeszłości Apple często zmieniał ustawienia domyślne, gdy stały się aktywne po połączeniu z bieżącym zestawem SDK. Mamy nadzieję , że otrzymamy stare zachowanie podczas łączenia z poprzednimi wersjami.
DrMickeyLauer

11
Mogę potwierdzić, że wbudowane aplikacje Xcode-10 działające na symulatorze iOS 13 nadal domyślnie wyświetlają pełny ekran. Jak powiedział @DrMickeyLauer, budowanie z Xcode 11 pozwala aplikacji na nowe zachowanie. Użyj, isModalInPresentationaby zablokować gest machnięcia przed odrzuceniem. Zobacz mój post na blogu, aby uzyskać więcej informacji: medium.com/@hacknicity/…
Geoff Hackworth

5
Zalecam użycie .fullScreen zamiast .overFullScreen. .fullScreen odpala widokWillAppear i viewDidAppear, .overFullScreen tego nie robi
PiterPan

5
Czas mijał, a .automaticstyl ustabilizował się jako domyślny, czyli .pageSheetstyl (dla większości kontrolerów widoków) . Jednak niektóre kontrolery widoku systemu mogą odwzorować go na inny styl.
Jakub Truhlář

186

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 .

wprowadź opis zdjęcia tutaj


2
Czy w Konstruktorze interfejsów jest sposób na ustawienie isModalInPresentation?
Brad Thomas

Zgadzam się z tym. Zmień wartość prezentacji dla widoków obrażających na najwyższym poziomie.
David

To dla mnie zadziałało, ponieważ mam performSegue. Dzięki, kochanie!
Blasanka

95

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:

fix_storyboard_presentation_default_behavior


1
Czy jest jakiś sposób to zrobić programowo dla wszystkich widoków zamiast jeden po drugim za pomocą scenorysu?
The1993

@ The1993 Czy znalazłeś jakąś alternatywę?
Shobhit Puri,

1
@ShobhitPuri Zobacz pierwsze rozwiązanie Omreyha tutaj stackoverflow.com/a/58255416/4323101
The1993

1
Wow, to była odpowiedź na moje problemy. Dzięki za wskazówkę! Dla wszystkich innych, którzy się tym zajmują, jest to naprawa dziwnego zachowania po ponownym otwarciu aplikacji z tła. W mojej aplikacji otwieranie z tła nakładałoby mój ekran powitalny (kontroler widoku początkowego) jako styl prezentacji karty, a następnie wszelkie sekwensy odtąd przechodziłyby w krzyżyk zamiast używać mojego zdefiniowanego stylu segue. Byłoby dobrze, gdybym zamknął aplikację (dotknij dwukrotnie przycisku Home i przesuń palcem w górę, a następnie ponownie otwórz), ale wszelkie dodatkowe uruchomienia spowodowałyby to dziwne zachowanie. Dzięki jeszcze raz!
Justin

92

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

class BaseViewController: UIViewController {

  // ....

  override func present(_ viewControllerToPresent: UIViewController,
                        animated flag: Bool,
                        completion: (() -> Void)? = nil) {
    viewControllerToPresent.modalPresentationStyle = .fullScreen
    super.present(viewControllerToPresent, animated: flag, completion: completion)
  }

  // ....
}

W ten sposób nie musisz wprowadzać żadnych zmian w żadnym presentwywołaniu, ponieważ po prostu przesłoniliśmy presentmetodę.

2- Rozszerzenie:

extension UIViewController {
  func presentInFullScreen(_ viewController: UIViewController,
                           animated: Bool,
                           completion: (() -> Void)? = nil) {
    viewController.modalPresentationStyle = .fullScreen
    present(viewController, animated: animated, completion: completion)
  }
}

Stosowanie:

presentInFullScreen(viewController, animated: true)

3- Dla jednego UIViewController

let viewController = UIViewController()
viewController.modalPresentationStyle = .fullScreen
present(viewController, animated: true, completion: nil)

4- Z Storyboard

Wybierz segue i ustaw prezentację na FullScreen.
wprowadź opis zdjęcia tutaj

5- Swizzling

extension UIViewController {

  static func swizzlePresent() {

    let orginalSelector = #selector(present(_: animated: completion:))
    let swizzledSelector = #selector(swizzledPresent)

    guard let orginalMethod = class_getInstanceMethod(self, orginalSelector), let swizzledMethod = class_getInstanceMethod(self, swizzledSelector) else{return}

    let didAddMethod = class_addMethod(self,
                                       orginalSelector,
                                       method_getImplementation(swizzledMethod),
                                       method_getTypeEncoding(swizzledMethod))

    if didAddMethod {
      class_replaceMethod(self,
                          swizzledSelector,
                          method_getImplementation(orginalMethod),
                          method_getTypeEncoding(orginalMethod))
    } else {
      method_exchangeImplementations(orginalMethod, swizzledMethod)
    }

  }

  @objc
  private func swizzledPresent(_ viewControllerToPresent: UIViewController,
                               animated flag: Bool,
                               completion: (() -> Void)? = nil) {
    if #available(iOS 13.0, *) {
      if viewControllerToPresent.modalPresentationStyle == .automatic {
        viewControllerToPresent.modalPresentationStyle = .fullScreen
      }
    }
    swizzledPresent(viewControllerToPresent, animated: flag, completion: completion)
   }
}

Zastosowanie:
W swoim AppDelegatewnętrzu application(_ application: didFinishLaunchingWithOptions)dodaj ten wiersz:

UIViewController.swizzlePresent()

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/


Mam w moim projekcie wielu kontrolerów viewControllerów, ale nie mam klasy podstawowej, nie chcę swizzlingu, czy masz na to jakieś rozwiązanie przy minimalnych zmianach kodu
guru

Użyłem swizzlinga, ale dodałem .pageSheet do warunku .... if viewControllerToPresent.modalPresentationStyle == .pageSheet || viewControllerToPresent.modalPresentationStyle == .automatic {viewControllerToPresent.modalPresentationStyle = .fullScreen}
Zawieszenie

pasek stanu ukrywa się, gdy dodam zastosowane rozwiązanie nr 1.
Ganesh Pawar

4
Swizzling to rozwiązanie, które działało świetnie przez jakiś czas. Jednak korzystając z niektórych zewnętrznych sdków, takich jak FacebookLogin (obecnie 5.8) i GoogleSignin, zauważyłem, że ta metoda przerywa te przepływy: na iPadzie dostajemy biały ekran. Wynika to prawdopodobnie z faktu, że używają własnej metody swizzling
Tao-Nhan Nguyen

39

Użyłem swizzlinga dla iOS 13

import Foundation
import UIKit

private func _swizzling(forClass: AnyClass, originalSelector: Selector, swizzledSelector: Selector) {
    if let originalMethod = class_getInstanceMethod(forClass, originalSelector),
       let swizzledMethod = class_getInstanceMethod(forClass, swizzledSelector) {
        method_exchangeImplementations(originalMethod, swizzledMethod)
    }
}

extension UIViewController {

    static let preventPageSheetPresentation: Void = {
        if #available(iOS 13, *) {
            _swizzling(forClass: UIViewController.self,
                       originalSelector: #selector(present(_: animated: completion:)),
                       swizzledSelector: #selector(_swizzledPresent(_: animated: completion:)))
        }
    }()

    @available(iOS 13.0, *)
    @objc private func _swizzledPresent(_ viewControllerToPresent: UIViewController,
                                        animated flag: Bool,
                                        completion: (() -> Void)? = nil) {
        if viewControllerToPresent.modalPresentationStyle == .pageSheet
                   || viewControllerToPresent.modalPresentationStyle == .automatic {
            viewControllerToPresent.modalPresentationStyle = .fullScreen
        }
        _swizzledPresent(viewControllerToPresent, animated: flag, completion: completion)
    }
}

następnie połóż to

UIViewController.preventPageSheetPresentation

gdzieś

na przykład w AppDelegate

func application(_ application: UIApplication,
                 didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]?) -> Bool {

    UIViewController.preventPageSheetPresentation
    // ...
    return true
}

3
Najłatwiejsze rozwiązanie, jeśli masz wiele modów.
Raisal Calicut

gdzieś oznacza, oznacza, w którym pliku lub gdzie w całym projekcie
Yatendra

gdzieś ty, umieszczam go w appdelegate static letjest leniwy, musisz go przeczytać, aby pozwolić mu być obliczonym, leniwy var obliczony tylko raz, używam go, aby mieć gwarancję, że swizzling zadzwonił raz
Maxime Ashurov

37

Dla użytkowników celu C

Po prostu użyj tego kodu

 [vc setModalPresentationStyle: UIModalPresentationFullScreen];

Lub jeśli chcesz dodać go konkretnie w iOS 13.0, użyj

 if (@available(iOS 13.0, *)) {
     [vc setModalPresentationStyle: UIModalPresentationFullScreen];
 } else {
     // Fallback on earlier versions
 }

2
działa to również na wcześniejszej wersji iOS, ale odpowiedź jest dobra
Catalin

4
UIModalPresentationFullScreen współpracuje z iOS 3.2+. Więc nie trzeba dodawać, jeśli inaczej warunek.
flame3

2
Z jakiegoś powodu w iOS 13.1.2 tylko w klasach Obj-c to nie działa, a modalPresentationStyle wyświetla tylko arkusz strony. Czy dzieje się to dla kogokolwiek innego?
Sevy11

@ Sevy11 Nie zaktualizowałem do iOS 13.1.2, ale działa dobrze o 13.1
9to5ios

Cześć @ Sevy11 Mam aktualizację mojego iOS 13.1.2 i działa dobrze, sprawdź na końcu
9to5ios

36

Jedna wkładka:

modalPresentationStylenależy ustawić w nawigatorze, który jest prezentowany .


iOS 13 i niższa wersja iOS fullScreen z overCurrentContexti navigationController

Testowany kod

let controller = UIViewController()
let navigationController = UINavigationController(rootViewController: controller)
navigationController.modalPresentationStyle = .overCurrentContext
self.navigationController?.present(navigationController, animated: true, completion: nil)

modalPresentationStyle wymagają ustawienia w navigationController .


Wyjaśnienie: prezentowanie viewController z NavigationController nie wymaga modalPresentationStyle, aby można go ustawić w nawigacjiController. Zamiast tego jest ustawiany na prezentowanym viewController. Jeśli jednak prezentujesz element navigationController, właściwość „modalPresentationStyle” powinna być ustawiona w elemencie navigationController, a nie w osadzonym viewController. To podejście działa na iOS 13.3, Xcode 11.3. Zobacz odpowiedź Yogesh Bharate.
Womble

@Pratik Sodha. Jakaś pomoc na ten temat? stackoverflow.com/questions/61429600/…
David

@Womble Wszelka pomoc w tym stackoverflow.com/questions/61429600/…
David

25

Jako wskazówka: Jeśli zadzwonisz na obecny, ViewControllerktóry jest osadzony w środku NavigationController, musisz ustawić NavigationControllerna.fullScreen i nie VC.

Możesz to zrobić jak @davidbates lub zrobić to programowo (jak @pascalbros).

Przykładowy scenariusz:

wprowadź opis zdjęcia tutaj

    //BaseNavigationController: UINavigationController {}
    let baseNavigationController = storyboard!.instantiateViewController(withIdentifier: "BaseNavigationController")
    var navigationController = UINavigationController(rootViewController: baseNavigationController)
    navigationController.modalPresentationStyle = .fullScreen
    navigationController.topViewController as? LoginViewController
    self.present(navigationViewController, animated: true, completion: nil)

19

Musiałem zrobić oba:

  1. Ustaw styl prezentacji na Pełny ekran

    Pełny ekran

  2. Ustaw górny pasek jako półprzezroczysty pasek nawigacyjny

Górny pasek


To bardzo dziwne założenie, że jakaś opcja w Symulowanych metrykach pomaga zmienić styl prezentacji
Alexander Kulabukhov

14

Zmień modalPresentationStyleprzed przedstawieniem

vc.modalPresentationStyle = UIModalPresentationFullScreen;

13

Oto proste rozwiązanie bez kodowania jednej linii.

  • Wybierz opcję Wyświetl kontroler w serii ujęć
  • Wybierz atrybut Inspector
  • Ustaw prezentację „Automatycznie” na „Pełny ekran”, jak pokazano poniżej

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.

wprowadź opis zdjęcia tutaj


Myślę, że najważniejsze jest to, że zrobiłeś to w NavigationController, co pokazuje obrazek, ale tekst nie mówi tego w ten sposób.
Andy Weinstein

1
upewnij się także, że kolejne sekwencje są „Pokaż”, a nie „Prezentuj modalnie”
Andy Weinstein

Ok, więc ten wydaje mi się działać, gdy używam kontrolera paska kart do kontrolowania innych widoków. Należy jednak ustawić Prezentację rzeczywistego „Kontrolera paska kart” na Pełny ekran, ponieważ kontroluje on wszystkie pozostałe widoki.
Charlie

12

Jeśli masz UITabController z ekranami z wbudowanymi kontrolerami nawigacji, musisz ustawić Prezentację UITabController na FullScreen, jak pokazano na poniższym obrazku

wprowadź opis zdjęcia tutaj


12

Oto rozwiązanie dla Objective-C

UIStoryboard *storyBoard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
ViewController *vc = [storyBoard instantiateViewControllerWithIdentifier:@"ViewController"];

vc.modalPresentationStyle = UIModalPresentationFullScreen;

[self presentViewController:vc animated:YES completion:nil];

10

Najnowsze na iOS 13 i Swift 5.x

let vc = ViewController(nibName: "ViewController", bundle: nil)

vc.modalPresentationStyle = .fullScreen

self.present(vc, animated: true, completion: nil)

8

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.

#import "UIViewController+Presentation.h"
#import "objc/runtime.h"

@implementation UIViewController (Presentation)

- (void)setModalPresentationStyle:(UIModalPresentationStyle)modalPresentationStyle {
    [self setPrivateModalPresentationStyle:modalPresentationStyle];
}

-(UIModalPresentationStyle)modalPresentationStyle {
    UIModalPresentationStyle style = [self privateModalPresentationStyle];
    if (style == NSNotFound) {
        return UIModalPresentationFullScreen;
    }
    return style;
}

- (void)setPrivateModalPresentationStyle:(UIModalPresentationStyle)modalPresentationStyle {
    NSNumber *styleNumber = [NSNumber numberWithInteger:modalPresentationStyle];
     objc_setAssociatedObject(self, @selector(privateModalPresentationStyle), styleNumber, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

- (UIModalPresentationStyle)privateModalPresentationStyle {
    NSNumber *styleNumber = objc_getAssociatedObject(self, @selector(privateModalPresentationStyle));
    if (styleNumber == nil) {
        return NSNotFound;
    }
    return styleNumber.integerValue;
}

@end

czy masz plik .h?
Pedro Góes

@ PedroGóes tak, ale składa się tylko z deklaracji kategorii: `` @interface UIViewController (Presentation) @end ``
Alexander Kulabukhov

7

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.

wprowadź opis zdjęcia tutaj

Dla tych, którzy aktywnie korzystają z Storyboard. Oto moja rada: skorzystaj z Regex.

Poniższy format nie jest odpowiedni dla stron pełnoekranowych:

<segue destination="Bof-iQ-svK" kind="presentation" identifier="importSystem" modalPresentationStyle="fullScreen" id="bfy-FP-mlc"/>

Poniższy format jest odpowiedni dla stron pełnoekranowych:

<segue destination="7DQ-Kj-yFD" kind="presentation" identifier="defaultLandingToSystemInfo" modalPresentationStyle="fullScreen" id="Mjn-t2-yxe"/>

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

<segue destination="(.*)"\s* kind="show" identifier="(.*)" id="(.*)"/>

Wymień Regex

<segue destination="$1" kind="presentation" identifier="$2" modalPresentationStyle="fullScreen" id="$3"/>

4

Początkowo wartością domyślną jest fullscreenmodalPresentationStyle, ale w iOS 13 jego zmiany dotyczą UIModalPresentationStyle.automatic.

Jeśli chcesz zrobić kontroler widoku pełnoekranowego, musisz zmienić modalPresentationStylenafullScreen .

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.


To jest poprawna odpowiedź od iOS 13.3, Xcode 11.3, dla sytuacji, w których chcesz przedstawić kontroler widoku z nawigatora. Działa również modalPresentationStyle z .overFullScreen. Jeśli jednak prezentujesz element NavigationController, musisz ustawić opcję „modalPresentationStyle” w module NavigationController, a nie viewController. Twoje zdrowie.
Womble

3

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"


2
let Obj = MtViewController()
Obj.modalPresentationStyle = .overFullScreen
self.present(Obj, animated: true, completion: nil)

// jeśli chcesz wyłączyć przesunięcie, aby je odrzucić, dodaj linię

Obj.isModalInPresentation = true

Sprawdź dokument Apple, aby uzyskać więcej informacji.


2

Osiągnąłem to, używając metody swizzling (Swift 4.2):

Aby utworzyć rozszerzenie UIViewController w następujący sposób

extension UIViewController {

    @objc private func swizzled_presentstyle(_ viewControllerToPresent: UIViewController, animated: Bool, completion: (() -> Void)?) {

        if #available(iOS 13.0, *) {
            if viewControllerToPresent.modalPresentationStyle == .automatic || viewControllerToPresent.modalPresentationStyle == .pageSheet {
                viewControllerToPresent.modalPresentationStyle = .fullScreen
            }
        }

        self.swizzled_presentstyle(viewControllerToPresent, animated: animated, completion: completion)
    }

     static func setPresentationStyle_fullScreen() {

        let instance: UIViewController = UIViewController()
        let aClass: AnyClass! = object_getClass(instance)

        let originalSelector = #selector(UIViewController.present(_:animated:completion:))
        let swizzledSelector = #selector(UIViewController.swizzled_presentstyle(_:animated:completion:))

        let originalMethod = class_getInstanceMethod(aClass, originalSelector)
        let swizzledMethod = class_getInstanceMethod(aClass, swizzledSelector)
        if let originalMethod = originalMethod, let swizzledMethod = swizzledMethod {
        method_exchangeImplementations(originalMethod, swizzledMethod)
        }
    }
}

oraz w AppDelegate, w aplikacji: didFinishLaunchingWithOptions: wywołaj swizzling kod, wywołując:

UIViewController.setPresentationStyle_fullScreen()

1

To działało dla mnie:

yourViewController.modalPresentationStyle = UIModalPresentationStyle.fullScreen


3
Nie dodaje to nic do wszystkich innych istniejących odpowiedzi.
rmaddy

1

Utwórz kategorię dla UIViewController (powiedz UIViewController + PresentationStyle). Dodaj do niego następujący kod.

 -(UIModalPresentationStyle)modalPresentationStyle{
     return UIModalPresentationStyleFullScreen;
}

spowoduje to uszkodzenie UISearchController + i wywoła trudną do debugowania awarię
dklt

@dklt To świetna obserwacja. Zatem jawne ustawienie właściwości rozwiąże problem. Nie ma prostszych rozwiązań, jeśli używa UISearchController.
Govind

0

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:

class MyBaseViewController: UIViewController {

//MARK: Initialisers

/// Alternative initializer which allows you to set the modal presentation syle
/// - Parameter modalStyle: the presentation style to be used
init(with modalStyle:UIModalPresentationStyle) {
    super.init(nibName: nil, bundle: nil)
    self.setup(modalStyle: modalStyle)
}

override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
    super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
    // default modal presentation style as fullscreen
    self.setup(modalStyle: .fullScreen)
}

required init?(coder: NSCoder) {
    super.init(coder: coder)
    // default modal presentation style as fullscreen
    self.setup(modalStyle: .fullScreen)
}

//MARK: Private

/// Setup the view
///
/// - Parameter modalStyle: indicates which modal presentation style to be used
/// - Parameter modalPresentation: default true, it prevent modally presented view to be dismissible with the default swipe gesture
private func setup(modalStyle:UIModalPresentationStyle, modalPresentation:Bool = true){
    if #available(iOS 13, *) {
        self.modalPresentationStyle = modalStyle
        self.isModalInPresentation = modalPresentation
    }
}

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


0

Miałem ten problem z filmem, który nie wyświetla już pełnego ekranu. Dodano tę linię, która uratowała dzień :-)

videoController.modalPresentationStyle = UIModalPresentationFullScreen;

2
Nie dodaje to nic do wszystkich innych istniejących odpowiedzi.
rmaddy

0

Najprostsze rozwiązanie, które działało dla mnie.

viewController.modalPresentationStyle = .fullScreen

3
Nie dodaje to nic do wszystkich innych istniejących odpowiedzi.
rmaddy

0

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.

let vc = UIViewController()
let navController = UINavigationController(rootViewController: vc)
navController.modalPresentationStyle = .fullScreen

0
class MyViewController: UIViewController {

    convenience init() {
        self.init(nibName:nil, bundle:nil)
        self.modalPresentationStyle = .fullScreen
    }

    override func viewDidLoad() {
        super.viewDidLoad()
    }
}

Zamiast wywoływać self.modalPresentationStyle = .fullScreendla każdego kontrolera widoku, możesz podklasować UIViewController i używać go MyViewControllerwszędzie.


-1

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ę ()

//#1
extension UIViewController {

//#2
func presentLocal(_ viewControllerToPresent: UIViewController, animated flag: 
Bool, completion: (() -> Void)? = nil) {

//Reusing below 2 lines :-)
viewControllerToPresent.modalPresentationStyle = .overCurrentContext
self.present(viewControllerToPresent, animated: flag, completion: completion)

  }
}

Wywoływanie jak poniżej

let vc = MyViewController()
let nc = UINavigationController(rootViewController: vc)
sourceView.presentLocal(nc, animated: true, completion: nil)

LUB

let vc = MyViewController()
sourceView.presentLocal(vc, animated: true, completion: nil)
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.