iOS: ViewController modale con sfondo trasparente


180

Sto cercando di presentare un controller di visualizzazione in modo modale, con uno sfondo trasparente. Il mio obiettivo è quello di consentire la visualizzazione simultanea della vista del controller di visualizzazione sia della presentazione che della presentazione. Il problema è che quando l'animazione di presentazione termina, la vista del controller della vista di presentazione scompare.

- (IBAction)pushModalViewControllerButtonPressed:(id)sender
{
    ModalViewController *modalVC = [[ModalViewController alloc] init];
    [self presentViewController:modalVC animated:YES completion:nil];
}

So che potrei semplicemente aggiungere la vista come sottoview, ma vorrei evitare questa soluzione per qualche motivo. Come potrei ripararlo?


4
@TheKing Sembra che Michael, come me, desideri che la vista modale sia traslucida, che appaia come uno strato di gel in bilico sulla vista primaria (di presentazione). Crea la sensazione che l'utente rimanga nel contesto corrente mentre effettua un'impostazione rapida, invece di passare ad alcune altre funzionalità principali (in una vista separata).
Basil Bourque,

Questo stackoverflow.com/q/27598846/1603234 mi fa sorridere, ora è il tuo turno :)
Hemang

Vedi la mia risposta qui stackoverflow.com/a/29794201/1606125 per iOS 8
Pankaj Wadhwa


1
Per iOS 10 funziona UIModalPresentationOverFullScreen come inigo333 menzionato di seguito.
Josef Rysanek,

Risposte:


97

Questo codice seguente funziona solo su iPad.

self.view.backgroundColor = [UIColor clearColor];
self.modalPresentationStyle = UIModalPresentationCurrentContext;
[self presentModalViewController:modalVC animated:YES];

Andrei con l'aggiunta di una vista secondaria.

Ecco un'ottima discussione. Guarda i commenti in particolare. Non solo la risposta.

Vista modale

Se fossi in te non lo farei. Vorrei aggiungere una vista secondaria e farlo. Sembra che mi dia un migliore controllo sulle cose.

MODIFICARE:

Come menzionato da Paul Linsay, dal momento che iOS 8 tutto ciò che serve è presentare UIModalPresentationOverFullScreenlo stile modale di ViewController. Questo coprirebbe anche i pulsanti di barra di navigazione e tabBar.


18
Si fa il lavoro su iOS 7 e anche su iPhone, la cosa è che è necessario specificare il modalPresentationStyle = UIModalPresentationCurrentContextsul presentatore controller della vista, e non nella presentato uno.
redent84

6
Sì, funziona ma SOLO se lo imposti nella gerarchia della vista superiore ViewController . (es. a NavigationControllero l'istanza del controller di visualizzazione del menu a scorrimento, ad esempio).
iGranDav,

4
Stranamente, nel mio caso ha funzionato solo dopo aver impostato lo stile modale su UIModalPresentationCustom, e solo se è impostato prima presentViewControllerpiuttosto che in viewDidLoad.
Mojuba,

5
Da iOS 8 tutto ciò che serve è UIModalPresentationOverFullScreen per il modalPresentationStyle del ViewController presentato.
Paul Linsay,

1
Dopo circa 1000 tentativi, mi sono reso conto che è necessario impostare modalPresentationStyle primaviewDidLoad . L'ho fatto nel costruttore e ha funzionato.
bendytree,

186

Per coloro che cercano di farlo funzionare in iOS 8, il modo "approvato da Apple" per visualizzare un controller di visualizzazione modale trasparente consiste nell'impostare modalPresentationStyle il controller ed presente su UIModalPresentationOverCurrentContext.

Questo può essere fatto in codice o impostando le proprietà dei segu nello storyboard.

Dalla documentazione di UIViewController:

UIModalPresentationOverCurrentContext

Uno stile di presentazione in cui il contenuto viene visualizzato solo sul contenuto del controller della vista padre. Le viste sotto il contenuto presentato non vengono rimosse dalla gerarchia delle viste al termine della presentazione. Pertanto, se il controller di visualizzazione presentato non riempie lo schermo di contenuto opaco, il contenuto sottostante viene visualizzato.

Quando si presenta un controller di visualizzazione in un popover, questo stile di presentazione è supportato solo se lo stile di transizione è UIModalTransitionStyleCoverVertical. Il tentativo di utilizzare uno stile di transizione diverso genera un'eccezione. Tuttavia, è possibile utilizzare altri stili di transizione (ad eccezione della transizione di arricciatura parziale) se il controller della vista padre non si trova in un popover.

Disponibile in iOS 8.0 e versioni successive.

https://developer.apple.com/documentation/uikit/uiviewcontroller

Il video "Visualizza i progressi del controller in iOS 8" del WWDC 2014 approfondisce questo aspetto in dettaglio.

Nota:

  • Assicurati di dare al controller della vista presentato un colore di sfondo chiaro, per evitare che sia effettivamente trasparente!
  • Devi impostarlo prima di presentare, vale a dire che l'impostazione di questo parametro nel viewDidLoaddi PresentViewController non avrà alcun effetto

32
Nota: sembra che la destinazione in cui è necessario impostare modalPresentationStyle sia cambiata. Ad esempio, in iOS 7, per farlo funzionare, avevo bisogno di impostare il modalPresentationStyle del View Controller che stava tentando di aprire il modale su UIModalPresentationCurrentContext . Tuttavia, per far funzionare tutto ciò su iOS8, ho dovuto impostare modalPresentationStyle della vista modale che verrà visualizzata su UIModalPresentationOverCurrentContext .
u2Fan

1
Se usi segues negli storyboard, devi impostare lo stile di presentazione lì. Almeno questo è ciò che ha funzionato per me.
Julian B.

Ho aggiunto queste tre righe nel metodo init nel controller di visualizzazione presentato e funziona come un incantesimo: self.providesPresentationContextTransitionStyle = YES; self.definesPresentationContext = YES; [self setModalPresentationStyle: UIModalPresentationOverCurrentContext];
inigo333

2
Su iOS 8+, ho dovuto presentare un modale da UINavigationController, quindi presentare da un bambino non mi ha fornito ciò di cui avevo bisogno. Invece sourceVCè self.navigationController. Inoltre, solo dopo aver impostato lo stile di presentazione di destinazione come personalizzato, ho potuto vedere attraverso di esso. [sourceVC setModalPresentationStyle:UIModalPresentationCurrentContext];, [targetVC setModalPresentationStyle:UIModalPresentationCustom];Spero che possa aiutare qualcuno.
devdc,

Nota: chiamare presentedVC.modalPresentationStyle = UIModalPresentationOverCurrentContextil VC di presentazione . Non funziona nel VC presentato. Fidati di me, ci ho provato.
smileham,

104

In iOS 8.0 e versioni successive, è possibile impostare la proprietà modalPresentationStyle su UIModalPresentationOverCurrentContext

//Set property **definesPresentationContext** YES to avoid presenting over presenting-viewController's navigation bar

self.definesPresentationContext = YES; //self is presenting view controller
presentedController.view.backgroundColor = [YOUR_COLOR with alpha OR clearColor]
presentedController.modalPresentationStyle = UIModalPresentationOverCurrentContext;

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

Vedi immagine allegata


5
Questa è l'unica soluzione che ho potuto mettere al lavoro. Anche molto semplice. Basta aggiungere questo al VC di presentazione prima che il modale segua.
Siriss,

1
Xcoe 9.2 / iOS 11.2 veloce .custome .overFullScreenfunzionante.
William Hu,

E sembra che se imposti .overFullScreenla vista attuale, il controller viewWillAppearnon verrà chiamato.
William Hu,

Un'altra cosa, presentedController.view.backgroundColor = #color#dovrebbe essere scritta in presentedController' viewDidLoad, altrimenti presentedControllerla vita è interrotta.
DawnSong,

44

Questo codice funziona bene su iPhone con iOS6 e iOS7:

presentedVC.view.backgroundColor = YOUR_COLOR; // can be with 'alpha'
presentingVC.modalPresentationStyle = UIModalPresentationCurrentContext;
[presentingVC presentViewController:presentedVC animated:YES completion:NULL];

In questo caso ti manca l'animazione slide-on. Per conservare l'animazione puoi comunque utilizzare la seguente estensione "non elegante":

[presentingVC presentViewController:presentedVC animated:YES completion:^{
    [presentedVC dismissViewControllerAnimated:NO completion:^{
        presentingVC.modalPresentationStyle = UIModalPresentationCurrentContext;
        [presentingVC presentViewController:presentedVC animated:NO completion:NULL];
    }];
}];

Se la nostra presentazione V si trova all'interno di UINavigationController o UITabbarController, è necessario operare con tali controller come presentandoVC.

Inoltre, in iOS7 è possibile implementare l'animazione di transizione personalizzata applicando il UIViewControllerTransitioningDelegateprotocollo. Naturalmente, in questo caso è possibile ottenere uno sfondo trasparente

@interface ModalViewController : UIViewController <UIViewControllerTransitioningDelegate>

Innanzitutto, prima di presentare devi impostare modalPresentationStyle

modalViewController.modalPresentationStyle = UIModalPresentationCustom;

Quindi devi implementare due metodi di protocollo

- (id<UIViewControllerAnimatedTransitioning>)animationControllerForPresentedController:(UIViewController *)presented presentingController:(UIViewController *)presenting sourceController:(UIViewController *)source
{
    CustomAnimatedTransitioning *transitioning = [CustomAnimatedTransitioning new];
    transitioning.presenting = YES;
    return transitioning;
}

- (id<UIViewControllerAnimatedTransitioning>)animationControllerForDismissedController:(UIViewController *)dismissed
{
    CustomAnimatedTransitioning * transitioning = [CustomAnimatedTransitioning new];
    transitioning.presenting = NO;
    return transitioning;
}

L'ultima cosa è definire la tua transizione personalizzata in CustomAnimatedTransitioningclasse

@interface CustomAnimatedTransitioning : NSObject <UIViewControllerAnimatedTransitioning>
@property (nonatomic) BOOL presenting;
@end

@implementation CurrentContextTransitionAnimator

- (NSTimeInterval)transitionDuration:(id <UIViewControllerContextTransitioning>)transitionContext 
{
    return 0.25;
}

- (void)animateTransition:(id <UIViewControllerContextTransitioning>)transitionContext 
{
    UIViewController *fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
    UIViewController *toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];

    if (self.presenting) {
        // custom presenting animation
    }
    else {
        // custom dismissing animation
    }
}

7
Confermato che funziona. NOTA che se il tuo ViewController è all'interno di un NavigationController, assicurati che modalPresentationStylesia impostato anche!
mxcl,

Penso che nei casi più comuni sia una buona idea trattare il controller di navigazione come presentando VC.
malex,

Sì, usando questo modalPresentationStyle impossibile ottenere la presentazione dell'animazione ((
malex

2
@alex sì, mi dispiace: il mio errore è stato quello di impostare modalPresentationStyle su UIModalPresentationCurrentContext per il VC presentato anziché per il prenstingVC.
Tiguero,

5
@mxcl E se il tuo viewController di navigazioneController è esso stesso all'interno di un tabBarController, assicurati che sia impostato anche il suo modalPresentationStyle;)
Thomas CG de Vilhena,

21

Ho faticato un po 'con Interface Builder di XCode 7 per impostare lo stile di presentazione come suggerito da @VenuGopalTewari. In questa versione, sembra non esserci modalità di presentazione Over Current Contexto no Over Full Screenper il seguito. Quindi, per farlo funzionare, ho impostato la modalità su Default:

inserisci qui la descrizione dell'immagine con inserisci qui la descrizione dell'immagine

Inoltre, ho impostato la modalità di presentazione del controller di visualizzazione presentato in modo modale su Over Full Screen:

inserisci qui la descrizione dell'immagine


Questo ha funzionato per me, nessun codice necessario. Sto usando Xcode 7.2, rapido e l'obiettivo è iOS 8.0
LightMan

Questo ha funzionato anche per me. +1 per la risposta corretta. Grazie :)
Agostino PA,

La migliore risposta qui!
shinyuX,

1
Nessun codice = migliore risposta. Bastian vince questo gioco. Per favore fai +1 su questa risposta.
Gene

Questa risposta ha funzionato..spendendo più di un'ora su questo
user578386

18

Crea un seguito da presentare in modo modale e imposta la proprietà Presentazione di quella che segue nel contesto corrente funzionerà al 100%

inserisci qui la descrizione dell'immagine


3
Ammiro i surfer al 100%, ha funzionato! La chiave è applicarlo sul seguito. Grazie mille
Badr,

Se non hai il tuo seguito collegato a un pulsante e lo stai chiamando a livello di codice, assicurati di impostare un identificatore e chiamare performSegueWithIdentifier invece di
presentViewController

1
Ho provato tutte le altre risposte, ma questa è l'unica che ha funzionato per me in iOS9.
Endavid

14

PresentViewController con sfondo trasparente - in iOS 8 e iOS 9

MYViewController *myVC = [self.storyboard   instantiateViewControllerWithIdentifier:@"MYViewController"];
    myVC.providesPresentationContextTransitionStyle = YES;
    myVC.definesPresentationContext = YES;
    [myVC setModalPresentationStyle:UIModalPresentationOverCurrentContext];
    [self.navigationController presentViewController:myVC animated:YES completion:nil];

E in MYViewController imposta il colore di sfondo nero e riduci l'opacità


12

È un po 'confuso, ma per me questo codice funziona (iOS 6):

AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];

[self presentViewController:self.signInViewController animated:YES completion:^{
    [self.signInViewController dismissViewControllerAnimated:NO completion:^{
        appDelegate.window.rootViewController.modalPresentationStyle = UIModalPresentationCurrentContext;
        [self presentViewController:self.signInViewController animated:NO completion:nil];
        appDelegate.window.rootViewController.modalPresentationStyle = UIModalPresentationFullScreen;

    }];
}];

Questo codice funziona anche su iPhone


Grazie - questo è esattamente ciò di cui avevo bisogno - mostrando una schermata iniziale di "Guida" nella parte superiore della Home principale. Bellissimo!
Matt H,

1
Oggi passo quasi 3 ore a navigare e cercare una soluzione che funzioni sia per iOS7 che iOS8. Considerando il fatto che questa risposta ha 1,5 anni e sto usando ECSlidingViewController, questa è l'unica soluzione che ha funzionato! Grazie @Mak.
Centurion,

Perfetto. Inoltre, se non ti interessa l'animazione, le 3 linee nel completamento interno funzionano perfettamente Grazie!
RasTheDestroyer

dopo 3 ore trascorse senza successo ho trovato questo, evviva, vorrei poter votare di più: D
alessioarsuffi

11

Questa categoria ha funzionato per me (iOS 7, 8 e 9)

File H.

@interface UIViewController (navigation)
- (void) presentTransparentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion;
@end

File M.

@implementation UIViewController (navigation)
- (void)presentTransparentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion
{
    if(SYSTEM_VERSION_LESS_THAN(@"8.0")) {
        [self presentIOS7TransparentController:viewControllerToPresent withCompletion:completion];

    }else{
        viewControllerToPresent.modalPresentationStyle = UIModalPresentationOverCurrentContext;
         [self presentViewController:viewControllerToPresent animated:YES completion:completion];
    }
}
-(void)presentIOS7TransparentController:(UIViewController *)viewControllerToPresent withCompletion:(void(^)(void))completion
{
    UIViewController *presentingVC = self;
    UIViewController *root = self;
    while (root.parentViewController) {
        root = root.parentViewController;
    }
    UIModalPresentationStyle orginalStyle = root.modalPresentationStyle;
    root.modalPresentationStyle = UIModalPresentationCurrentContext;
    [presentingVC presentViewController:viewControllerToPresent animated:YES completion:^{
        root.modalPresentationStyle = orginalStyle;
    }];
}
@end

1
Ho controllato tutta la risposta .. ma per me la tua risposta è un lavoro perfetto .. "+1" per questo. @Ted
g212gs

1
Pensavo di non riuscire a trovare una soluzione. Molte grazie!
CopperCash,

10

La soluzione a questa risposta usando swift sarebbe la seguente.

let vc = MyViewController()
vc.view.backgroundColor = UIColor.clear // or whatever color.
vc.modalPresentationStyle = .overCurrentContext
present(vc, animated: true, completion: nil)

9

Se stai usando Storyboard, puoi seguire questo passaggio:

  1. Aggiungi un controller di visualizzazione (V2), imposta l'interfaccia utente nel modo desiderato
  • aggiungi un UIView - imposta lo sfondo su nero e l'opacità su 0,5
  • aggiungi un altro UIView (2) - che fungerà da popup (tieni presente che UIView e UIView (2) devono avere lo stesso livello / gerarchia. Non rendere l'immagine vista figlio della vista, altrimenti l'opacità dell'uiview sarà influenzare l'UIView (2))
  1. Present V2 Modally

  2. Fai clic su segue. Nella finestra di ispezione Attributi, Imposta presentazione come A schermo intero . Rimuovi l'animazione, se lo desideri

storyboard

  1. Seleziona V2. Nella finestra di ispezione Attributi, Imposta presentazione come A schermo intero . Controlla definisce il contesto e fornisce il contesto

storyboard

  1. Seleziona il MainView del tuo V2 (vedi immagine di controllo). Imposta backgroundColor su Clear Color

storyboard


6

Ho aggiunto queste tre righe nel metodo init nel controller di visualizzazione presentato e funziona come un incantesimo:

self.providesPresentationContextTransitionStyle = YES;
self.definesPresentationContext = YES;
[self setModalPresentationStyle:UIModalPresentationOverCurrentContext];

EDIT (lavorando su iOS 9.3):

self.modalPresentationStyle = UIModalPresentationOverFullScreen;

Come da documentazione:

UIModalPresentationOverFullScreen Uno stile di presentazione della vista in cui la vista presentata copre lo schermo. Le viste sotto il contenuto presentato non vengono rimosse dalla gerarchia delle viste al termine della presentazione. Pertanto, se il controller di visualizzazione presentato non riempie lo schermo di contenuto opaco, il contenuto sottostante viene visualizzato.

Disponibile in iOS 8.0 e versioni successive.


1
Lavorando su iOS 10.2.
Josef Rysanek,

4

Il modo alternativo è utilizzare una "vista contenitore". Crea alpha al di sotto di 1 e incorporalo con seque. XCode 5, target iOS7. Testato su iPhone.

inserisci qui la descrizione dell'immagine

Vista contenitore disponibile da iOS6. Link a post di blog su questo.


3

Ho creato un oggetto per gestire la presentazione di quello che chiamo un "modale sovrapposto", il che significa che mantiene la vista dello sfondo e consente di avere un modale con uno sfondo trasparente.

Ha un metodo unico e semplice per fare ciò:

- (void)presentViewController:(UIViewController *)presentedViewController
       fromViewController:(UIViewController *)presentingViewController
{
    presentedViewController.modalPresentationStyle = UIModalPresentationCustom;
    presentedViewController.transitioningDelegate = self;
    presentedViewController.modalPresentationCapturesStatusBarAppearance = YES;

    [presentedViewController setNeedsStatusBarAppearanceUpdate];

    [presentingViewController presentViewController:presentedViewController
                                       animated:YES
                                     completion:nil];
}

È importante impostare la modalPresentationCapturesStatusBarAppearanceproprietà su YESe forzare l'aggiornamento dell'aspetto della barra di stato, se il controller della vista presentato ha un diverso preferredStatusBarStyle.

Questo oggetto dovrebbe avere a @property (assign, nonatommic) isPresenting

Si desidera che questo oggetto di conformarsi alle UIViewControllerAnimatedTransitioninge UIViewControllerTransitioningDelegateprotocolli e implementare i metodi seguenti:

- (id)animationControllerForPresentedController:(UIViewController *)presented
                           presentingController:(UIViewController *)presenting
                               sourceController:(UIViewController *)source
{
    self.isPresenting = YES;

    return self;
}

- (id)animationControllerForDismissedController:(UIViewController *)dismissed
{
    self.isPresenting = NO;

    return self;
}

e:

- (NSTimeInterval)transitionDuration:(id)transitionContext
{
    return 0.25;
}

- (void)animateTransition:(id)transitionContext
{
    UIViewController* firstVC = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
    UIViewController* secondVC = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
    UIView* containerView = [transitionContext containerView];
    UIView* firstView = firstVC.view;
    UIView* secondView = secondVC.view;

    if (self.isPresenting) {
        [containerView addSubview:secondView];
        secondView.frame = (CGRect){
            containerView.frame.origin.x,
            containerView.frame.origin.y + containerView.frame.size.height,
            containerView.frame.size
        };

        firstView.tintAdjustmentMode = UIViewTintAdjustmentModeDimmed;
        [UIView animateWithDuration:0.25 animations:^{
            secondView.frame = containerView.frame;
        } completion:^(BOOL finished) {
            [transitionContext completeTransition:YES];
        }];
        } else {
        [UIView animateWithDuration:0.25 animations:^{
            firstView.frame = (CGRect){
                containerView.frame.origin.x,
                containerView.frame.origin.y + containerView.frame.size.height,
                containerView.frame.size
        };

        } completion:^(BOOL finished) {
            [transitionContext completeTransition:YES];
        }];
    }
}

Questo fa un'animazione slide-in-the-the-bottom che imita l'animazione modale predefinita, ma puoi renderla come vuoi.

L'importante è che la vista del controller della vista di presentazione rimanga nella parte posteriore, consentendoti di creare un effetto trasparente.

Questa soluzione funziona per iOS 7+


Grazie per la tua risposta.
Salman Khakwani,

3

Un modo molto semplice per farlo (usando Storyboards, ad esempio) è:

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"SomeStoryboard" bundle:nil];
UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"SomeStoryboardViewController"];
// the key for what you're looking to do:
vc.modalPresentationStyle = UIModalPresentationOverCurrentContext;
vc.view.alpha = 0.50f;

[self presentViewController:vc animated:YES completion:^{
    // great success
}];

Questo presenterà un UIViewControllerin modo Storyboardmodale, ma con uno sfondo traslucido.


3

Funzionando per iOS 7-10

if #available(iOS 8.0, *) {
    nextVC.modalPresentationStyle = .OverCurrentContext
    self.presentViewController(nextVC, animated: true, completion: nil)
} else {
    // Fallback on earlier version
    self.modalPresentationStyle = .Custom          
    nextVC.modalTransitionStyle = .CrossDissolve            
    self.presentViewController(nextVC, animated: false, completion: nil)
    }
}

2

Per ricapitolare tutte le risposte e i commenti validi qui e continuare ad avere un'animazione mentre ci si sposta nel nuovo, ViewControllerquesto è quello che ho fatto: (Supporta iOS 6 e versioni successive)

Se stai usando un UINavigationController\ UITabBarControllerquesto è il modo di procedere:

    SomeViewController *vcThatWillBeDisplayed = [self.storyboard instantiateViewControllerWithIdentifier:@"SomeVC"];

    vcThatWillBeDisplayed.view.backgroundColor = [UIColor colorWithRed: 255/255.0 green:255/255.0 blue:255/255.0 alpha:0.50];    

    self.navigationController.modalPresentationStyle = UIModalPresentationCurrentContext;
    [self presentViewController:presentedVC animated:YES completion:NULL];

Se lo farai, perderai l' modalTransitionStyleanimazione. Per risolverlo puoi aggiungere facilmente alla tua SomeViewControllerclasse questo:

-(void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    [UIView animateWithDuration:0.4 animations:^() {self.view.alpha = 1;}
       completion:^(BOOL finished){}];
}
- (void)viewDidLoad
{
    [super viewDidLoad];
    self.view.alpha = 0;
}

2

Ovviamente dovresti impostare UIModalPresentationCurrentContext, ma anche il posto dove impostare clearColor è molto importante! Non è possibile impostare lo sfondo nella funzione viewDidLoad, impostarlo prima che la vista si caricasse come nel controller della vista principale o nella funzione init del controller che sta per presentare!

actionController.view.backgroundColor = [UIColor clearColor];
[self presentViewController:actionController animated:YES completion:nil];

o

- (instancetype)init {

    self = [super initWithNibName:nil bundle:nil];

    if(self) {
        self.modalPresentationStyle = UIModalPresentationOverCurrentContext;
        [self.view setBackgroundColor:[UIColor clearColor]];
    }

    return self;
}

Questo è stato il suggerimento che mi ha aiutato tra tutti gli altri. Grazie per l'aiuto.
Tomasz Nazarenko,

1

Se stai usando il modal segue, assicurati di impostarlo come questa immagine (puoi disattivare l'animazione se vuoi)inserisci qui la descrizione dell'immagine


1

Un metodo completo testato su iOS 7 e iOS 8.

@interface UIViewController (MBOverCurrentContextModalPresenting)

/// @warning Some method of viewControllerToPresent will called twice before iOS 8, e.g. viewWillAppear:.
- (void)MBOverCurrentContextPresentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion;

@end

@implementation UIViewController (MBOverCurrentContextModalPresenting)

- (void)MBOverCurrentContextPresentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion {
    UIViewController *presentingVC = self;

    // iOS 8 before
    if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_7_1) {
        UIViewController *root = presentingVC;
        while (root.parentViewController) {
            root = root.parentViewController;
        }

        [presentingVC presentViewController:viewControllerToPresent animated:YES completion:^{
            [viewControllerToPresent dismissViewControllerAnimated:NO completion:^{
                UIModalPresentationStyle orginalStyle = root.modalPresentationStyle;
                if (orginalStyle != UIModalPresentationCurrentContext) {
                    root.modalPresentationStyle = UIModalPresentationCurrentContext;
                }
                [presentingVC presentViewController:viewControllerToPresent animated:NO completion:completion];
                if (orginalStyle != UIModalPresentationCurrentContext) {
                    root.modalPresentationStyle = orginalStyle;
                }
            }];
        }];
        return;
    }

    UIModalPresentationStyle orginalStyle = viewControllerToPresent.modalPresentationStyle;
    if (orginalStyle != UIModalPresentationOverCurrentContext) {
        viewControllerToPresent.modalPresentationStyle = UIModalPresentationOverCurrentContext;
    }
    [presentingVC presentViewController:viewControllerToPresent animated:YES completion:completion];
    if (orginalStyle != UIModalPresentationOverCurrentContext) {
        viewControllerToPresent.modalPresentationStyle = orginalStyle;
    }
}

@end

1

Rapido 4.2

guard let someVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "someVC") as? someVC else {
    return
}
someVC.modalPresentationStyle = .overCurrentContext

present(someVC, animated: true, completion: nil)

0

nel delegato dell'app:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    [[_window rootViewController]setModalPresentationStyle:UIModalPresentationCurrentContext];
    return YES;
}

nella prima vista controller da cui devi caricare la vista successiva:

  NextViewController *customvc = [[NextViewController alloc]init];
    [self presentViewController:customvc animated:YES completion:^{

    }];

nel tuo prossimo ViewController che deve essere aggiunto trasparente:

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor clearColor];
    UIView* backView = [[UIView alloc] initWithFrame:self.view.frame];
    backView.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.6];
    [self.view insertSubview:backView atIndex:0];
}

0

La schermata di accesso è modale, il che significa che si trova in cima alla schermata precedente. Finora abbiamo Sfondo sfocato, ma non è nulla di sfocato; è solo uno sfondo grigio.

Dobbiamo impostare correttamente il nostro modale.

target link immagine

  • Innanzitutto, dobbiamo cambiare lo sfondo Visualizza del controller di visualizzazione in Cancella colore. Significa semplicemente che dovrebbe essere trasparente. Per impostazione predefinita, quella vista è bianca.

  • In secondo luogo, dobbiamo selezionare il Segue che porta alla schermata di accesso e, nella finestra di ispezione degli attributi, impostare la Presentazione su Over Current Context. Questa opzione è disponibile solo con Layout automatico e Classi dimensioni abilitate.

target link immagine


0

Impostare la navigazione modalPresentationStylesuUIModalPresentationCustom

e imposta il colore di sfondo del controller di visualizzazione presentato come colore chiaro.

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.