19

J'ai un dilema, je veux présenter à l'utilisateur une vue semi-transparente. J'ai découvert en expérimentant que si je poussais simplement la vue transparente en haut de la pile de mon NavigationController, cela ne rendrait pas le niveau de transparence que je voulais. J'ai donc décidé d'ajouter simplement la vue en sous-vue de la vue actuelle en haut de la pile.Fond transparent avec un UIViewController modal

Cette solution fonctionne, la vue ci-dessous est toujours visible et la vue est 'semi-modale'. Le problème est que, si la vue parente hérite de UITableViewController (comme la mienne), alors la vue que j'appuie dessus ne couvre pas la barre de navigation en haut. Je ne veux vraiment pas entrer dans une situation où je suis forcé d'activer/désactiver les contrôles sur la barre de navigation chaque fois que je pousse cette vue, donc je me demandais, si quelqu'un connaissait des solutions que je pourrais utiliser de sorte que la vue que j'appuie sur le UITableViewController va réellement «pousser» la barre de navigation?

+0

http://stackoverflow.com/questions/12741224/ios-modal-viewcontroller-with-transparent-background/22829068#22829068 – Zaraki

Répondre

13

Drôle, je faisais juste la même chose hier. Malheureusement, cela semble impossible. Une fois le contrôleur de vue modale en place, la vue précédente devient masquée. Voir ceci previous question on the topic.

Vous pouvez toujours utiliser le contrôleur de vue et les fichiers NIB vous avez mis en place - voici mon exemple de code

- (void)showUpgrade { 
    [self.upgradeVC viewWillAppear:NO]; 
    [self.view addSubview:self.upgradeVC.view]; 
    [self.upgradeVC viewDidAppear:NO]; 
} 

- (void)hideUpgrade { 
    [self.upgradeVC viewWillDisappear:NO]; 
    [self.upgradeVC.view removeFromSuperview]; 
    [self.upgradeVC viewDidDisappear:NO]; 
} 

- (UpgradeViewController *)upgradeVC { 
    if (_upgradeVC == nil) { 
     _upgradeVC = [[UpgradeViewController alloc] initWithNibName:[NSString stringWithFormat:@"UpgradeView_%@", self.deviceType] bundle:nil]; 
     _upgradeVC.delegate = self; 
    } 
    return _upgradeVC; 
} 

Vous devrez stocker une référence au contrôleur de vue parent dans le contrôleur modal vue afin que vous pouvez accéder à la méthode -hide. Je l'ai fait par l'intermédiaire d'un délégué.

Il serait également facile d'ajouter de l'animation à -show et -hide si vous voulez l'animer depuis le bas de l'écran - j'étais juste trop paresseux pour le faire.

+0

Je ne pense pas que apple sdk permette un bg transparent sur un UIViewController sur l'iPhone. –

+0

Comment gérez-vous les différentes orientations de l'appareil lorsque vous faites cela? Il me semble que ça va toujours charger la vue portrait qui est un problème si la vue actuelle est en paysage. –

+0

ce n'est pas une bonne pratique. Regardez cet article. Il explique pourquoi l'ajout d'une vue de VC à une autre en tant que sous-vue est une mauvaise idée. http://blog.carbonfive.com/2011/03/09/abusing-uiviewcontrollers/ – hackerinheels

-2

Avez-vous essayé de faire défiler les sous-vues du Modal View Controller et de définir la couleur d'arrière-plan pour chaque vue? C'est une fonction récursive DFS.

- (void)setBackgroundToClearForView:(UIView *)view { 
    if ([view subviews]) { 
     for (UIView *subView in [view subviews]) { 
      [self setBackgroundToClearForView:subView]; 
     } 
    } 

    if ([view respondsToSelector:@selector(setBackgroundColor:)]) { 
     [view performSelector:@selector(setBackgroundColor:) 
        withObject:[UIColor clearColor]]; 
    } 
} 

Pour l'utiliser appelez:

[self setBackgroundToClearForView:self.view]; 

dans viewDidLoad.

+0

Je n'ai pas essayé cela moi-même, mais je crois comprendre que la vue parent est en fait retirée de la pile de vue. Voir: http://stackoverflow.com/questions/587681/how-to-use-presentmodalviewcontroller-to-create-a-transparent-view – pix0r

-2

Cela fera l'affaire .. Essayez celui-ci.

// for clear color or you can easily adjust the alpha here 
YourVC *vc=[[YourVC alloc]initWithNibName:@"YourVC" bundle:nil] ; 
vc.view.backgroundColor = [UIColor clearColor]; 
self.modalPresentationStyle = UIModalPresentationCurrentContext; 
[self presentViewController:vc animated:NO completion:nil]; 

Pour que la vue soit en plein écran contrairement à UIModalPresentationFormSheet ..

+3

Ne travaillait pas pour moi. – mxcl

+1

Cela ne fonctionne pas, pour les raisons décrites - les vues d'arrière-plan sont supprimées après la présentation modale. – tooluser

11

Il y a maintenant un moyen d'y parvenir en utilisant des transitions personnalisées d'iOS 7:

MyController * controller = [MyController new]; 
[controller setTransitioningDelegate:self.transitionController]; 
controller.modalPresentationStyle = UIModalPresentationCustom; 
[self controller animated:YES completion:nil]; 

Pour créer votre transition personnalisée, vous avez besoin de 2 choses:

  • Un objet TransitionDelegate (mise en œuvre <UIViewControllerTransitionDelegate>)
  • Un objet "AnimatedTransitioning" (implémentant <UIViewControllerAnimatedTransitioning>)

Vous pouvez trouver plus d'informations sur les transitions personnalisées dans ce tutoriel: http://www.doubleencore.com/2013/09/ios-7-custom-transitions/

0

Essayez ceci:

ViewController *vc = [[ViewController alloc] init]; 
[vc setModalPresentationStyle:UIModalPresentationOverCurrentContext]; 
[self presentViewController:vc animated:YES completion:nil]; 
+0

J'ai essayé ça, ça ne marche pas :( – Supertecnoboff

13

iOS 8 ajouté le UIModalPresentationOverFullScreenpresentation style. Définissez ceci comme modalPresentationStyle du contrôleur de vue présenté. Pour des besoins plus avancés, regardez dans la création d'un presentation controller personnalisé.

+0

Merci cela a fonctionné parfaitement pour moi :) – Supertecnoboff

+0

Cela devrait être la bonne réponse maintenant que iOS 8+ a une adoption de> 91% sur les appareils iOS à partir du 24 octobre, 2015 – Manuel

Questions connexes