[iphone] Afficher clearColor UIViewController sur UIViewController


7 Answers

iOS8 +

Dans iOS8 +, vous pouvez maintenant utiliser le nouveau modalPresentationStyle UIModalPresentationOverCurrentContext pour présenter un contrôleur de vue avec un arrière-plan transparent:

MyModalViewController *modalViewController = [[MyModalViewController alloc] init];
modalViewController.modalPresentationStyle = UIModalPresentationOverCurrentContext;           
[self presentViewController:modalViewController animated:YES completion:nil];    
Question

J'ai une vue UIViewController tant que sous-vue / modal au-dessus d'une autre vue UIViewController , par exemple que la sous-vue / modale devrait être transparente et que tous les composants ajoutés à la sous-vue devraient être visibles. Le problème est que j'ai la sous-vue montre fond noir à la place d'avoir clearColor. J'essaie de faire de UIView un clearColor non noir. Est-ce que quelqu'un sait ce qui ne va pas? Toute suggestion appréciée.

FirstViewController.m

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"SecondViewController"];

[vc setModalPresentationStyle:UIModalPresentationFullScreen];
[self presentModalViewController:vc animated:NO];  

SecondViewController.m

- (void)viewDidLoad 
{
     [super viewDidLoad];
     self.view.opaque = YES;
     self.view.backgroundColor = [UIColor clearColor];
}

RÉSOLU : J'ai corrigé les problèmes. Il fonctionne si bien pour iPhone et iPad. Modal View Controller sans fond noir juste clearColor / transparent. La seule chose que j'ai besoin de changer est de remplacer UIModalPresentationFullScreen par UIModalPresentationCurrentContext . Comme c'est simple!

FirstViewController.m

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"SecondViewController"];
vc.view.backgroundColor = [UIColor clearColor];
self.modalPresentationStyle = UIModalPresentationCurrentContext;
[self presentViewController:vc animated:NO completion:nil];

AVIS: Si vous utilisez une propriété modalPresentationStyle de navigationController :

FirstViewController.m

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"SecondViewController"];
vc.view.backgroundColor = [UIColor clearColor];
self.navigationController.modalPresentationStyle = UIModalPresentationCurrentContext;
[self presentViewController:vc animated:NO completion:nil];

AVIS: La mauvaise nouvelle est que la solution ci-dessus ne fonctionne pas sur iOS 7. Les bonnes nouvelles sont que j'ai corrigé le problème pour iOS7! J'ai demandé de l'aide à quelqu'un et voici ce qu'il a dit:

Lorsque vous présentez un contrôleur de vues de manière modale, iOS supprime les contrôleurs de vue situés en dessous de la hiérarchie de vue pendant la durée de la présentation. Alors que la vue de votre contrôleur de vue modulaire est transparente, il n'y a rien en dessous, sauf la fenêtre de l'application, qui est noire. iOS 7 a introduit un nouveau style de présentation modale, UIModalPresentationCustom , qui UIModalPresentationCustom iOS de supprimer les vues sous le contrôleur de vue présenté. Toutefois, pour utiliser ce style de présentation modale, vous devez fournir votre propre délégué de transition pour gérer la présentation et ignorer les animations. Ceci est décrit dans la présentation «Transitions personnalisées à l'aide des contrôleurs de vue» de la WWDC 2013 https://developer.apple.com/wwdc/videos/?id=218 qui décrit également comment implémenter votre propre délégué de transition.

Vous pouvez voir ma solution pour le problème ci-dessus dans iOS7: https://github.com/hightech/iOS-7-Custom-ModalViewController-Transitions




Fonctionne très bien sur iOS7 et iOS8

UIViewController* vc=[[UIViewController alloc]initWithNibName:@"VC" bundle:nil];

vc.view.alpha=0.7;
[vc setModalPresentationStyle:UIModalPresentationOverCurrentContext];

self.navigationController.modalPresentationStyle = UIModalPresentationCurrentContext;

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



Pour iOS 7 et uniquement en utilisant Interface Builder, il est possible de définir la présentation sur "Over Current Context" sur tous les contrôleurs de vue impliqués dans la présentation modale. Même pour les contrôleurs de navigation.

Par exemple, définissez-le sur tous ces contrôleurs de vue:

NavController -> RootViewController -> ModalViewController




Utilisez simplement "self.modalPresentationStyle = UIModalPresentationCurrentContext;", dans la vue de présentation

Cela fonctionnera bien :)




Une autre façon (pas besoin de créer une transition personnalisée et fonctionne sur iOS 7)

Utilisation de Storyboard:

Créez le contrôleur de vue enfant avec la taille de liberté, définissez la largeur de vue à 500x500 (par exemple) et ajoutez la méthode suivante:

- (void)viewWillLayoutSubviews{
    [super viewWillLayoutSubviews];
    self.view.superview.bounds = CGRectMake(0, 0, 500, 500);
    self.view.superview.backgroundColor = [UIColor clearColor];
}

Créez ensuite une section modale avec la feuille de formulaire et testez-la.




Pour moi cela fonctionne:

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main_iPhone" bundle:nil];
    UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"MMPushNotificationViewController"];

    vc.view.backgroundColor = [UIColor clearColor];
    self.modalPresentationStyle = UIModalPresentationCurrentContext;
#ifdef __IPHONE_8_0
    if(IS_OS_8_OR_LATER)
    {
        self.providesPresentationContextTransitionStyle = YES;
        self.definesPresentationContext = YES;
        [vc setModalPresentationStyle:UIModalPresentationOverCurrentContext];
    }
#endif


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

MMPushNotificationViewController est le contrôleur Transparent View et j'ai également rendu la MMPushNotificationViewController la vue de MMPushNotificationViewController en tant que clearcolor. Maintenant tout ce que j'ai fait et fait mon contrôleur transparent.




Ceci est à partir de xCode 7 beta 4 en utilisant un contrôle segue glisser. Définissez simplement l'arrière-plan de votre destination pour l'effacer, et définissez les propriétés de la section dans IB comme ceci (la présentation peut aussi être "Over Full Screen"):




Solution Swift 3 & iOS10:

//create view controller
let vc = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "RoadTripPreviewViewController")
//remove black screen in background
vc.modalPresentationStyle = .overCurrentContext
//add clear color background
vc.view.backgroundColor = UIColor.clear
//present modal
self.present(vc, animated: true, completion: nil)





Related