Presentazione modale in iOS 13 a schermo intero


466

In iOS 13 c'è un nuovo comportamento per il controller di visualizzazione modale quando viene presentato.

Ora non è a schermo intero per impostazione predefinita e quando provo a scorrere verso il basso, l'app elimina automaticamente View Controller.

Come posso prevenire questo comportamento e tornare al vecchio vc modale a schermo intero?

comportamento modale

Grazie

Risposte:


622

Con iOS 13, come affermato nello stato dell'Unione delle piattaforme durante il WWDC 2019, Apple ha introdotto una nuova presentazione di carte predefinita. Per forzare lo schermo intero devi specificarlo esplicitamente con:

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

81
Direi che questo non rimarrà a lungo come predefinito. L' fullScreenopzione dovrebbe essere predefinita per evitare di interrompere le modifiche all'interfaccia utente.
Jakub Truhlář,

17
Non ci contare. In passato, Apple ha spesso modificato le impostazioni predefinite diventando attiva solo dopo aver effettuato il collegamento con l'SDK corrente. Noi speriamo che ottenere il vecchio comportamento durante il collegamento con le versioni precedenti.
DrMickeyLauer,

11
Posso confermare che le app integrate Xcode-10 eseguite sul simulatore iOS 13 continuano a essere impostate sullo schermo intero. Come ha detto @DrMickeyLauer, la creazione con Xcode 11 avvia l'app al nuovo comportamento. Utilizzare isModalInPresentationper bloccare il gesto di scorrimento dal rifiuto. Vedi il mio post sul blog per maggiori dettagli: medium.com/@hacknicity/…
Geoff Hackworth

5
Consiglio di usare .fullScreen invece di .overFullScreen. .fullScreen attiva la visualizzazione WillAppear e viewDidAppear, .overFullScreen non lo fa
PiterPan

5
Il tempo è passato e lo .automaticstile si è stabilizzato come quello predefinito, ovvero lo stile (per la maggior parte dei controller di visualizzazione) .pageSheet. Tuttavia, alcuni controller di visualizzazione del sistema possono mapparlo su uno stile diverso.
Jakub Truhlář,

186

Aggiungo un'informazione che potrebbe essere utile per qualcuno. Se segui uno storyboard, per tornare al vecchio stile, devi impostare la proprietà kind su Present Modally e la proprietà Presentation su Full Screen .

inserisci qui la descrizione dell'immagine


2
Esiste un modo in Interface Builder per impostare isModalInPresentation?
Brad Thomas,

D'accordo con questo Modifica il valore Presentazione per le viste offensive di livello più alto.
David,

Questo è quello che ha funzionato per me perché l'ho fatto performSegue. Grazie caro!
Blasanka,

95

Ho avuto questo problema nella vista iniziale subito dopo la schermata di avvio. La soluzione per me, dato che non avevo un seguito o una logica definita, era di cambiare la presentazione da automatica a schermo intero, come mostrato qui:

fix_storyboard_presentation_default_behavior


2
Esiste un modo per farlo programmaticamente per tutte le visualizzazioni anziché uno per uno tramite lo storyboard?
The1993

@ The1993 Hai trovato qualche alternativa a questo?
Shobhit Puri,

1
@ShobhitPuri Vai a vedere che la prima soluzione da Omreyh qui stackoverflow.com/a/58255416/4323101
The1993

1
Caspita, questa era LA risposta per i miei problemi. Grazie per il consiglio! Anche per tutti gli altri, questa è la soluzione per comportamenti strani dopo aver riaperto l'app dallo sfondo. Nella mia applicazione, l'apertura dallo sfondo sovrapponeva la mia schermata iniziale (controller di vista iniziale) come stile di presentazione della scheda e quindi i follower da qui in poi svanivano invece di utilizzare il mio stile di sequ definito. Andrebbe bene se chiudessi l'app (premi due volte il pulsante Home e scorri verso l'alto, quindi riaprilo) ma eventuali lanci aggiuntivi causerebbero questo strano comportamento. Grazie ancora!
Justin l'

92

Esistono diversi modi per farlo, e penso che ognuno potrebbe adattarsi a un progetto ma non a un altro, quindi ho pensato di tenerli qui, forse qualcun altro si imbatterà in un caso diverso.

1- Sostituisci presente

Se ne hai uno BaseViewControllerpuoi sovrascrivere il present(_ viewControllerToPresent: animated flag: completion:)metodo.

class BaseViewController: UIViewController {

  // ....

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

  // ....
}

In questo modo non è necessario apportare alcuna modifica a nessuna presentchiamata, poiché abbiamo appena annullato il presentmetodo.

2- Un'estensione:

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

Uso:

presentInFullScreen(viewController, animated: true)

3- Per un UIViewController

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

4- Dallo storyboard

Seleziona un seguito e imposta la presentazione su FullScreen.
inserisci qui la descrizione dell'immagine

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)
   }
}

Uso:
Nel tuo AppDelegateinterno application(_ application: didFinishLaunchingWithOptions)aggiungi questa riga:

UIViewController.swizzlePresent()

In questo modo non è necessario apportare alcuna modifica a nessuna chiamata presente, poiché stiamo sostituendo l'implementazione del metodo attuale in fase di esecuzione.
Se hai bisogno di sapere cosa gira, puoi controllare questo link: https://nshipster.com/swift-objc-runtime/


Ho molti viewController nel mio progetto, ma non ho una classe base, non voglio sfrigolare, hai qualche soluzione per questo con modifiche minime al codice
guru

Ho usato lo swizzling, ma ho aggiunto .pageSheet alla condizione .... if viewControllerToPresent.modalPresentationStyle == .pageSheet || viewControllerToPresent.modalPresentationStyle == .automatic {viewControllerToPresent.modalPresentationStyle = .fullScreen}
Arresto anomalo

la barra di stato si nasconde quando aggiungo la soluzione applicata n. 1.
Ganesh Pawar,

4
Swizzling è una soluzione che ha funzionato alla grande per un po '. Tuttavia, quando si utilizzano alcuni sdk esterni come FacebookLogin (5.8 ad oggi) e GoogleSignin, ho notato che questo metodo interrompe questi flussi: otteniamo uno schermo bianco su iPad. Ciò è probabilmente dovuto al fatto che usano il loro metodo frizzante
Tao-Nhan Nguyen,

39

Ho usato swizzling per 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)
    }
}

quindi metti questo

UIViewController.preventPageSheetPresentation

da qualche parte

ad esempio in AppDelegate

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

    UIViewController.preventPageSheetPresentation
    // ...
    return true
}

3
La soluzione più semplice se hai più modali.
Raisal Calicut,

da qualche parte significa, significa in quale file o dove nell'intero progetto
Yatendra

da qualche parte te, l'ho messo in appdelegate static letè pigro, devi leggerlo per farlo calcolare, pigro var calcolato una sola volta, lo uso per avere la garanzia che lo sfrigolio chiamato una volta
Maxime Ashurov

37

Per gli utenti di Objective-C

Usa questo codice

 [vc setModalPresentationStyle: UIModalPresentationFullScreen];

Oppure, se si desidera aggiungerlo in particolare in iOS 13.0, utilizzare

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

2
funziona anche su versioni precedenti di iOS, ma la risposta è buona
Catalin,

4
UIModalPresentationFullScreen funziona con iOS 3.2+. Quindi non c'è bisogno di aggiungere se altrimenti condizione.
flame3,

2
Per qualche motivo in iOS 13.1.2 solo nelle classi Obj-c questo non funziona e modalPresentationStyle visualizza solo un foglio di pagina. Sta succedendo questo per qualcun altro?
Sevy11

@ Sevy11 Non ho aggiornato a iOS 13.1.2 ma funziona bene alle 13.1
9to5ios

ciao @ Sevy11 Ho aggiornato il mio iOS 13.1.2 e funziona bene, per favore controlla alla fine
9to5ios

37

Una fodera:

modalPresentationStyledeve essere impostato sul controller di navigazione che viene presentato .


iOS 13 e versioni precedenti iOS versione a schermo intero con overCurrentContexte navigationController

Codice testato

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

modalPresentationStyle deve essere impostato su navigationController .


Un chiarimento: la presentazione di un viewController da un NavigationController non richiede l'impostazione modalPresentationStyle sul dispositivo di navigazione. Invece, è impostato sul viewController che viene presentato. Tuttavia, se si presenta un navigationController, la proprietà 'modalPresentationStyle' deve essere impostata su navigationController, non su viewController incorporato. Questo approccio funziona su iOS 13.3, Xcode 11.3. Vedi la risposta di Yogesh Bharate.
Womble,

@Pratik Sodha. Qualche aiuto su questo? stackoverflow.com/questions/61429600/…
david

@Womble Qualsiasi aiuto su questo stackoverflow.com/questions/61429600/…
david

25

Come suggerimento: se chiamate presente a un ViewControllerche è incorporato all'interno di un, NavigationControllerdovete impostare NavigationControllersu .fullScreene non sul VC.

Puoi farlo come @davidbates o farlo in modo programmatico (come @pascalbros).

Uno scenario di esempio:

inserisci qui la descrizione dell'immagine

    //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)

22

Ho dovuto fare entrambe le cose:

  1. Imposta lo stile di presentazione come Schermo intero

    A schermo intero

  2. Imposta la barra superiore come barra di navigazione traslucida

Barra in alto



14

Cambia modalPresentationStyleprima di presentare

vc.modalPresentationStyle = UIModalPresentationFullScreen;

13

Ecco una soluzione semplice senza codificare una sola riga.

  • Seleziona Visualizza controller nello Storyboard
  • Seleziona l'attributo Inspector
  • Impostare la presentazione "Automatico" su "Schermo intero" come da immagine sotto

Questa modifica rende il comportamento dell'app per iPad come previsto, altrimenti il ​​nuovo schermo viene visualizzato al centro dello schermo come popup.

inserisci qui la descrizione dell'immagine


Penso che la chiave qui sia che tu l'abbia fatto sul NavigationController, che è ciò che l'immagine mostra ma il testo non lo dice in questo modo.
Andy Weinstein,

1
assicurati anche che i successivi siano "Show" e non "Present Modally"
Andy Weinstein il

Ok, quindi questo sembra funzionare per me quando uso un controller della barra delle schede per controllare altre visualizzazioni. Tuttavia, è necessario impostare la Presentazione dell'attuale "Controller barra delle schede" su Schermo intero poiché controlla tutte le altre visualizzazioni.
Charlie,

12

Se si dispone di un UITabController con schermate con controller di navigazione incorporati, è necessario impostare la presentazione di UITabController su FullScreen come mostrato nell'immagine seguente

inserisci qui la descrizione dell'immagine


12

Ecco la soluzione per Objective-C

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

vc.modalPresentationStyle = UIModalPresentationFullScreen;

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

11

Più recente per iOS 13 e Swift 5.x

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

vc.modalPresentationStyle = .fullScreen

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

9

Ecco la mia versione della correzione in ObjectiveC usando Categorie. Con questo approccio avrai il comportamento UIModalPresentationStyleFullScreen predefinito fino a quando un altro non viene impostato esplicitamente.

#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

hai il file .h?
Pedro Góes,

@ PedroGóes sì, ma consiste solo nella dichiarazione di categoria: `` @interface UIViewController (Presentazione) @end ``
Alexander Kulabukhov

Usa questo se non vuoi avere a che fare con tutti i controller nello storyboard! Risparmio di tempo, grazie!
AnthoPak

7

Tutte le altre risposte sono sufficienti, ma per un grande progetto come il nostro e in cui si effettuano navigazioni sia in codice che in storyboard, è un compito piuttosto scoraggiante.

inserisci qui la descrizione dell'immagine

Per coloro che stanno attivamente utilizzando Storyboard. Questo è il mio consiglio: usa Regex.

Il seguente formato non è adatto per le pagine a schermo intero:

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

Il seguente formato è buono per le pagine a schermo intero:

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

Il seguente regex compatibile con VS CODE convertirà tutte le pagine di vecchio stile in nuove pagine di stile. Potrebbe essere necessario evitare caratteri speciali se si utilizzano altri motori regex / editor di testo.

Cerca Regex

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

Sostituisci Regex

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

4

Inizialmente, il valore predefinito è fullscreenper modalPresentationStyle, ma in iOS 13 le sue modifiche a UIModalPresentationStyle.automatic.

Se si vuole fare la vista del regolatore a schermo intero è necessario cambiare l' modalPresentationStylea fullScreen.

Fare riferimento alla UIModalPresentationStyle documentazione di Apple per maggiori dettagli e consultare le linee guida dell'interfaccia umana di Apple per sapere dove utilizzare quale modalità.


Questa è la risposta corretta a partire da iOS 13.3, Xcode 11.3, per le situazioni in cui si desidera presentare un viewController DA un controller di navigazione. Funziona anche un modalPresentationStyle di .overFullScreen. Tuttavia, se si presenta un NavigationController, è necessario impostare "modalPresentationStyle" sul NavigationController, non su viewController. Saluti.
Womble,

3

Puoi farlo facilmente Apri lo storyboard come codice sorgente e cerca kind="presentation", in tutto il tag seague con kind = presentation aggiungi un attributo extramodalPresentationStyle="fullScreen"


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

// se si desidera disabilitare lo scorrimento per ignorarlo, aggiungere la riga

Obj.isModalInPresentation = true

Controlla il documento Apple per ulteriori informazioni.


2

L'ho raggiunto usando il metodo swizzling (Swift 4.2):

Per creare un'estensione UIViewController come segue

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)
        }
    }
}

e in AppDelegate, nell'applicazione: didFinishLaunchingWithOptions: invoca il codice di scorrimento chiamando:

UIViewController.setPresentationStyle_fullScreen()

1

Questo ha funzionato per me:

yourViewController.modalPresentationStyle = UIModalPresentationStyle.fullScreen


3
Ciò non aggiunge nulla a tutte le altre risposte esistenti.
rmaddy,

1

Crea una categoria per UIViewController (ad esempio UIViewController + PresentationStyle). Aggiungi il seguente codice ad esso.

 -(UIModalPresentationStyle)modalPresentationStyle{
     return UIModalPresentationStyleFullScreen;
}

questo interromperà UISearchController + innescherà un arresto anomalo del debug
dklt

@dklt Questa è un'ottima osservazione. Quindi l'impostazione esplicita della proprietà risolverà il problema. Nessuna soluzione più semplice se si utilizza UISearchController.
Govind

0

un approccio alternativo consiste nell'avere il proprio componente viewcontroller di base nella propria app e implementare semplicemente gli inizializzatori designati e richiesti con un'impostazione di base, simile al seguente:

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
    }
}

NOTA : se il controller di visualizzazione è contenuto in un controller di navigazione che viene effettivamente presentato in modo modale, il controller di navigazione dovrebbe affrontare il problema allo stesso modo (ovvero, avere il componente del controller di navigazione personalizzato personalizzato nello stesso modo

Testato su Xcode 11.1 su iOS 13.1 e iOS 12.4

Spero che sia d'aiuto


0

Ho avuto questo problema con un video che non presentava più a schermo intero. Aggiunta questa riga, che ha salvato la giornata :-)

videoController.modalPresentationStyle = UIModalPresentationFullScreen;

2
Ciò non aggiunge nulla a tutte le altre risposte esistenti.
rmaddy,

0

La soluzione più semplice che ha funzionato per me.

viewController.modalPresentationStyle = .fullScreen

3
Ciò non aggiunge nulla a tutte le altre risposte esistenti.
rmaddy,

0

Se si utilizza un UINavigationController e si incorpora un ViewController come controller di visualizzazione radice, si verificherebbe anche lo stesso problema. Utilizzare il seguente codice per superare.

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

Piuttosto che chiamare self.modalPresentationStyle = .fullScreenper ogni controller di visualizzazione, è possibile sottoclassare UIViewController e utilizzarlo MyViewControllerovunque.


-1

Le risposte e i suggerimenti sopra riportati sono giusti, di seguito è riportata un'altra versione e un modo efficace di utilizzare a livello di codice.

# 1 ha creato un'estensione UIView

# 2 ha creato un metodo ()

//#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)

  }
}

Invocando come di seguito

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

O

let vc = MyViewController()
sourceView.presentLocal(vc, animated: true, completion: nil)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.