iOS: Modal ViewController avec fond transparent

180

J'essaye de présenter un contrôleur de vue de manière modale, avec un fond transparent. Mon objectif est de permettre à la vue des contrôleurs de présentation et de présentation d'être affichées en même temps. Le problème est que lorsque l'animation de présentation se termine, la vue du contrôleur de vue de présentation disparaît.

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

Je sais que je pourrais simplement ajouter la vue en tant que sous-vue, mais j'aimerais éviter cette solution pour une raison quelconque. Comment pourrais-je résoudre ce problème?

Michael
la source
4
@TheKing On dirait que Michael, comme moi, veut que la vue modale soit translucide, qu'elle apparaisse comme une couche de gel planant sur la vue principale (présentation). Crée le sentiment que l'utilisateur reste dans le contexte actuel tout en effectuant un réglage rapide, par opposition à une autre fonctionnalité majeure (dans une vue séparée).
Basil Bourque
Ce stackoverflow.com/q/27598846/1603234 me fait sourire, maintenant à votre tour :)
Hemang
Voir ma réponse ici stackoverflow.com/a/29794201/1606125 pour iOS 8
Pankaj Wadhwa
version swift ici stackoverflow.com/a/34578402/3380878
Mojtabye
1
Pour iOS 10 fonctionne UIModalPresentationOverFullScreen comme inigo333 mentionné ci-dessous.
Josef Rysanek

Réponses:

97

Ce code suivant ne fonctionne que sur l'iPad.

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

J'irais avec l'ajout d'une vue secondaire.

Voici une très bonne discussion. Regardez les commentaires en particulier. Pas seulement la réponse.

Vue modale

Si j'étais toi, je ne le ferais pas. Je voudrais ajouter une vue secondaire et le faire. Cela me donne un meilleur contrôle sur les choses.

ÉDITER:

Comme mentionné par Paul Linsay, depuis iOS 8, tout ce qui est nécessaire est UIModalPresentationOverFullScreenle modalPresentationStyle du ViewController présenté. Cela couvrirait également les boutons navigationBar et tabBar.

SP
la source
18
Il fait le travail sur iOS 7 et aussi sur iPhone, la chose est que vous devez spécifier le modalPresentationStyle = UIModalPresentationCurrentContextsur le présentateur contrôleur de vue, et non dans la présente un.
redent84
6
Oui, cela fonctionne mais UNIQUEMENT si vous définissez ceci sur le plus élevé ViewController de votre hiérarchie de vues. (par exemple, a NavigationControllerou l'instance de votre contrôleur d'affichage du menu des diapositives par exemple).
iGranDav
4
Étrangement, dans mon cas, cela ne fonctionnait qu'après avoir défini le style modal sur UIModalPresentationCustom, et uniquement s'il est défini juste avant presentViewControllerplutôt que dans viewDidLoad.
mojuba
5
Depuis iOS 8, tout ce dont vous avez besoin est UIModalPresentationOverFullScreen pour le modalPresentationStyle du ViewController présenté.
Paul Linsay
1
Après environ 1000 tentatives, j'ai réalisé que vous deviez régler modalPresentationStyle avantviewDidLoad . Je l'ai fait dans le constructeur et cela a fonctionné.
bendytree
186

Pour ceux qui essaient de faire fonctionner cela dans iOS 8, la façon «approuvée par Apple» d'afficher un contrôleur de vue modale transparent consiste à définir modalPresentationStyle sur le contrôleur ed actuel sur UIModalPresentationOverCurrentContext.

Cela peut être fait dans le code ou en définissant les propriétés de la séquence dans le storyboard.

À partir de la documentation UIViewController:

UIModalPresentationOverCurrentContext

Un style de présentation où le contenu est affiché uniquement sur le contenu du contrôleur de vue parent. Les vues sous le contenu présenté ne sont pas supprimées de la hiérarchie des vues une fois la présentation terminée. Ainsi, si le contrôleur de vue présenté ne remplit pas l'écran avec un contenu opaque, le contenu sous-jacent apparaît.

Lors de la présentation d'un contrôleur de vue dans un popover, ce style de présentation est pris en charge uniquement si le style de transition est UIModalTransitionStyleCoverVertical. Tenter d'utiliser un style de transition différent déclenche une exception. Cependant, vous pouvez utiliser d'autres styles de transition (à l'exception de la transition de boucle partielle) si le contrôleur de vue parent n'est pas dans un popover.

Disponible dans iOS 8.0 et versions ultérieures.

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

La vidéo `` Afficher les progrès du contrôleur dans iOS 8 '' de la WWDC 2014 explique cela en détail.

Remarque:

  • Assurez-vous de donner à votre contrôleur de vue présenté une couleur d'arrière-plan claire, de peur qu'il ne soit pas réellement transparent!
  • Vous devez définir cela avant de présenter, c'est-à-dire que la configuration de ce paramètre dans le viewDidLoadde la présentationViewController n'aura aucun effet
Jeff C.
la source
32
Remarque - Il semble que la cible sur laquelle vous devez définir modalPresentationStyle a changé. Par exemple, dans iOS 7, pour que cela fonctionne, je devais définir le modalPresentationStyle du (des) contrôleur (s) de vue qui tentaient d'ouvrir le modal à UIModalPresentationCurrentContext . Cependant, pour que cela fonctionne dans iOS8, j'avais besoin de définir le modalPresentationStyle de la vue modale qui allait être affichée dans UIModalPresentationOverCurrentContext .
u2Fan
1
Si vous utilisez des segues dans vos storyboards, vous devez y définir le style de présentation. Au moins, c'est ce qui a fonctionné pour moi.
Julian B.
J'ai ajouté ces trois lignes dans la méthode init dans le contrôleur de vue présenté et fonctionne comme un charme: self.providesPresentationContextTransitionStyle = YES; self.definesPresentationContext = OUI; [self setModalPresentationStyle: UIModalPresentationOverCurrentContext];
inigo333
2
Sur iOS 8+, je devais présenter un modal d'un UINavigationController, donc la présentation d'un enfant ne me fournissait pas ce dont j'avais besoin. Au lieu de cela, sourceVCc'est self.navigationController. De plus, ce n'est qu'après avoir défini le style de présentation cible comme personnalisé que je pouvais voir à travers. [sourceVC setModalPresentationStyle:UIModalPresentationCurrentContext];, [targetVC setModalPresentationStyle:UIModalPresentationCustom];J'espère que cela aidera quelqu'un.
devdc
Remarque - Appelez presentedVC.modalPresentationStyle = UIModalPresentationOverCurrentContextle VC de présentation . Ne fonctionne pas dans le presentVC. Croyez-moi, j'ai essayé.
smileham
104

Dans iOS 8.0 et supérieur, cela peut être fait en définissant la propriété modalPresentationStyle sur 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];

Voir l'image ci-jointe

sat20786
la source
5
C'est la seule solution que je pourrais mettre au travail. Très simple aussi. Ajoutez simplement ceci à votre VC de présentation avant la séquence modale.
Siriss
1
Xcoe 9.2 / iOS 11.2 rapide .customet .overFullScreenfonctionne.
William Hu
Et il semble que si vous définissez .overFullScreenle contrôleur de vue actuel, le contrôleur ne viewWillAppearsera pas appelé.
William Hu
Une dernière chose, presentedController.view.backgroundColor = #color#devrait être écrite dans presentedController's viewDidLoad, sinon presentedControllerla vie de s est interrompue.
DawnSong
44

Ce code fonctionne très bien sur iPhone sous iOS6 et iOS7:

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

Dans ce cas, vous manquez une animation de diapositives. Pour conserver l'animation, vous pouvez toujours utiliser l'extension "non élégante" suivante:

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

Si notre présentationV est située à l'intérieur de UINavigationController ou UITabbarController, vous devez opérer avec ces contrôleurs comme présentantVC.

De plus, dans iOS7, vous pouvez implémenter un UIViewControllerTransitioningDelegateprotocole d' application d'animation de transition personnalisée . Bien sûr, dans ce cas, vous pouvez obtenir un fond transparent

@interface ModalViewController : UIViewController <UIViewControllerTransitioningDelegate>

Tout d'abord, avant de présenter, vous devez définir modalPresentationStyle

modalViewController.modalPresentationStyle = UIModalPresentationCustom;

Ensuite, vous devez implémenter deux méthodes de protocole

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

La dernière chose est de définir votre transition personnalisée en 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
    }
}
malex
la source
7
Confirmé que cela fonctionne. NOTE que si votre viewController se trouve dans un NavigationController puis assurer son modalPresentationStyleest réglé aussi!
mxcl
Je pense que dans les cas les plus courants, il est judicieux de traiter votre contrôleur de navigation comme présentantVC.
malex
Oui, en utilisant ce modalPresentationStyle impossible d'obtenir une animation de présentation ((
malex
2
@alex oui ça marche désolé: mon erreur a été de définir modalPresentationStyle sur UIModalPresentationCurrentContext pour le presentVC au lieu du prenstingVC.
tiguero le
5
@mxcl Et si le navigationController de votre viewController est lui-même à l'intérieur d'un tabBarController, assurez-vous que son modalPresentationStyle est également défini;)
Thomas CG de Vilhena
21

J'ai eu un peu de mal avec le générateur d'interface de XCode 7 pour définir le style de présentation comme @VenuGopalTewari le suggérait. Dans cette version, il semble n'y avoir aucun mode de présentation Over Current Contextou de Over Full Screenprésentation pour la suite. Ainsi, pour que cela fonctionne, j'ai réglé le mode sur Default:

entrez la description de l'image ici avec entrez la description de l'image ici

De plus, j'ai défini le mode de présentation du contrôleur de vue présenté modalement sur Over Full Screen:

entrez la description de l'image ici

Bastian
la source
Cela a fonctionné pour moi, aucun code nécessaire. J'utilise Xcode 7.2, swift et la cible est iOS 8.0
LightMan
Cela a fonctionné pour moi aussi. +1 pour la bonne réponse. Merci :)
Augustine PA
Meilleure réponse ici!
shinyuX
1
Pas de code = meilleure réponse. Bastian remporte ce match. Plz all +1 cette réponse.
GeneCode
Cette réponse a fonctionné .. passer plus d'une heure à ce sujet
user578386
18

Créez une séquence pour présenter modalement et définissez la propriété Presentation de cette séquence sur le contexte actuel, elle fonctionnera à 100%

entrez la description de l'image ici

Venu Gopal Tewari
la source
3
J'admire les 100% surers, ça a marché! La clé est de l'appliquer sur le segue. Merci beaucoup
Badr
Si votre segue n'est pas connecté à un bouton et que vous l'appelez par programme, assurez-vous de définir un identifiant et d'appeler performSegueWithIdentifier au lieu de
presentViewController
1
J'ai essayé toutes les autres réponses, mais c'est la seule qui a fonctionné pour moi dans iOS9.
endavid
14

PresentViewController avec fond transparent - sous iOS 8 et 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];

Et dans MYViewController, définissez la couleur d'arrière-plan noire et réduisez l'opacité

Ashwini Chougale
la source
12

C'est un peu hacky, mais pour moi ce code fonctionne (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;

    }];
}];

Ce code fonctionne également sur iPhone

Mak
la source
Merci - c'est exactement ce dont j'avais besoin - montrant un premier écran «Aide» en haut de la page d'accueil principale. Belle!
Matt H
1
Aujourd'hui, je passe près de 3 heures à parcourir et à rechercher une solution qui fonctionne à la fois pour iOS7 et iOS8. Compte tenu du fait que cette réponse a 1,5 ans et que j'utilise ECSlidingViewController, c'est la seule solution qui a fonctionné! Merci @Mak.
Centurion
Parfait. De plus, si vous ne vous souciez pas de l'animation, les 3 lignes de la finition intérieure fonctionnent parfaitement Merci!
RasTheDestroyer
après 3 heures passées sans succès, j'ai trouvé ceci, bravo, j'aimerais pouvoir voter plus: D
alessioarsuffi
11

Cette catégorie a fonctionné pour moi (iOS 7, 8 et 9)

Fichier H

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

Dossier 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
Ted
la source
1
J'ai vérifié toutes les réponses .. mais pour moi votre réponse est un travail parfait .. "+1" pour cela. @Ted
g212gs
1
Je pensais ne pas trouver de solution. Merci beaucoup!
CopperCash
10

La solution à cette réponse en utilisant swift serait la suivante.

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

Si vous utilisez Storyboard, vous pouvez suivre cette étape:

  1. Ajoutez un contrôleur de vue (V2), configurez l'interface utilisateur comme vous le souhaitez
  • ajouter un UIView - définir l'arrière-plan en noir et l'opacité à 0,5
  • ajoutez un autre UIView (2) - qui servira de popup (veuillez noter que l'UIView et l'UIView (2) doivent avoir le même niveau / hiérarchie. Ne faites pas de l'imageview l'enfant de la vue sinon l'opacité de l'uiview sera affecte l'UIView (2))
  1. Présenter V2 Modalement

  2. Cliquez sur la séquence. Dans l'inspecteur des attributs, définissez la présentation sur plein écran . Supprimez l'animation si vous le souhaitez

Storyboard

  1. Sélectionnez V2. Dans l'inspecteur des attributs, définissez la présentation sur plein écran . La vérification définit le contexte et fournit le contexte

Storyboard

  1. Sélectionnez le MainView de votre V2 (Pls. Vérifiez l'image). Définir backgroundColor sur Clear Color

Storyboard

dhin
la source
6

J'ai ajouté ces trois lignes dans la méthode init dans le contrôleur de vue présenté et fonctionne comme un charme:

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

EDIT (fonctionnant sous iOS 9.3):

self.modalPresentationStyle = UIModalPresentationOverFullScreen;

Selon la documentation:

UIModalPresentationOverFullScreen Style de présentation de vue dans lequel la vue présentée couvre l'écran. Les vues sous le contenu présenté ne sont pas supprimées de la hiérarchie des vues une fois la présentation terminée. Ainsi, si le contrôleur de vue présenté ne remplit pas l'écran avec un contenu opaque, le contenu sous-jacent apparaît.

Disponible dans iOS 8.0 et versions ultérieures.

inigo333
la source
1
Travailler sur iOS 10.2.
Josef Rysanek
4

Une autre façon est d'utiliser une "vue conteneur". Faites juste un alpha inférieur à 1 et intégrez-le avec seque. XCode 5, cible iOS7. Testé sur iPhone.

entrez la description de l'image ici

Vue conteneur disponible depuis iOS6. Lien vers l'article de blog à ce sujet.

Mike Glukhov
la source
3

J'ai créé un objet pour gérer la présentation de ce que j'appelle un "modal superposé", ce qui signifie qu'il conserve la vue de l'arrière-plan et vous permet d'avoir un modal avec un fond transparent.

Il a une méthode unique et simple qui fait cela:

- (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];
}

Il est important de définir la modalPresentationCapturesStatusBarAppearancepropriété sur YESet de forcer la mise à jour de l'apparence de la barre d'état, si votre contrôleur de vue présenté a un autrepreferredStatusBarStyle .

Cet objet doit avoir un @property (assign, nonatommic) isPresenting

Vous voulez que cet objet se conformer aux UIViewControllerAnimatedTransitioninget UIViewControllerTransitioningDelegateprotocoles et mettre en œuvre les méthodes suivantes:

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

    return self;
}

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

    return self;
}

et:

- (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];
        }];
    }
}

Cela fait une animation coulissante du bas imitant l'animation modale par défaut, mais vous pouvez la créer comme vous le souhaitez.

L'important est que la vue du contrôleur de vue de présentation reste à l'arrière, vous permettant de créer un effet transparent.

Cette solution fonctionne pour iOS 7+

Pedro Mancheno
la source
Merci pour votre réponse.
Salman Khakwani
3

Une manière très simple de faire cela (en utilisant Storyboards, par exemple) est:

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

Cela présentera un UIViewControllerdans un Storyboardmodal, mais avec un fond translucide.

JaredH
la source
3

Travailler pour 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)
    }
}
iluvatar_GR
la source
2

Pour récapituler toutes les bonnes réponses et commentaires ici et pour avoir encore une animation tout en passant à votre nouveau, voici ViewControllerce que j'ai fait: (Prend en charge iOS 6 et plus)

Si vous utilisez un UINavigationController\, UITabBarControllerc'est la voie à suivre:

    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];

Si vous faites cela, vous perdrez votre modalTransitionStyleanimation. Afin de le résoudre, vous pouvez facilement ajouter à votre SomeViewControllerclasse ceci:

-(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;
}
Segev
la source
2

Bien sûr, vous devez définir UIModalPresentationCurrentContext, mais l'emplacement pour définir clearColor est également très important! Vous ne pouvez pas définir l'arrière-plan dans la fonction viewDidLoad, définissez-le avant que la vue ne se charge comme dans le contrôleur de vue racine ou dans la fonction d'initialisation du contrôleur qui va présenter!

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

ou

- (instancetype)init {

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

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

    return self;
}
Santiago
la source
C'était l'indication qui m'a aidé parmi tous les autres. Merci de votre aide.
Tomasz Nazarenko
1

Si vous utilisez la séquence modale, assurez-vous de la définir comme cette image (vous pouvez désactiver l'animation si vous le souhaitez)entrez la description de l'image ici

Ahmed
la source
1

Une méthode complète testée sur iOS 7 et 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
BB9z
la source
1

Swift 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)
Aleksey Shevchenko
la source
0

dans appdelegate:

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

dans votre premier contrôleur de vue à partir duquel vous devez charger la vue suivante:

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

    }];

dans votre nextViewController qui doit être ajouté transparent:

- (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];
}
Zaraki
la source
0

L'écran de connexion est modal, ce qui signifie qu'il se trouve au-dessus de l'écran précédent. Jusqu'à présent, nous avons un arrière-plan flou, mais cela ne brouille rien; c'est juste un fond gris.

Nous devons définir correctement notre modal.

cible du lien image

  • Tout d'abord, nous devons changer l'arrière-plan de la vue du contrôleur de vue en couleur claire. Cela signifie simplement qu'il doit être transparent. Par défaut, cette vue est blanche.

  • Deuxièmement, nous devons sélectionner le segment qui mène à l'écran de connexion et, dans l'inspecteur d'attributs, définir la présentation sur Plus de contexte actuel. Cette option n'est disponible que si la disposition automatique et les classes de taille sont activées.

cible du lien image

tinkl
la source
0

Définir la navigation modalPresentationStylesurUIModalPresentationCustom

et définissez la couleur d'arrière-plan de votre contrôleur de vue présenté comme couleur claire.


la source