web-dev-qa-db-fra.com

Présenter UIViewController en tant que modal à fond transparent

J'essaie de présenter un contrôleur de vue avec un arrière-plan transparent à la fois sur iOS 7 et iOS 8. . En modifiant simplement la propriété modalPresentationStyle du contrôleur de contrôle en FormSheet, je peux le faire fonctionner sur iOS 7.1.

Ce que je veux, c'est un moyen universel de le faire sur ios7 +

J'ai essayé d'utiliser d'autres options de modalPresentationStyle, telles que: OverCurrentContext, CurrentContext et PageSheet.

J'ai aussi essayé d'utiliser modalPresentationStyle.Custom mais je n'ai pas eu de succès.

J'ai NavigationController si cela aide en quoi que ce soit. 

Le code du contrôleur de vue de présentation:

InfoViewController *info = [[InfoViewController alloc] initWithNibName:@"InfoViewController" bundle:nil];
[self presentViewController:info animated:YES completion:nil];

Et le code de viewDidLoad (qui, je pense, a une partie pertinente à ce sujet) de ViewController présenté:

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.
    self.modalPresentationStyle = UIModalPresentationStyle.PageSheet
}

J'utilise Swift et Xcode 6. Voici une capture d'écran de ce que j'ai maintenant et de ce que je veux, respectivement:

enter image description hereenter image description here

Voici un exemple de code: https://github.com/pbassut/TransBackgroundViewController

12
Patrick Bassut

Pour ceux qui ont encore ce problème avant de présenter UIViewController, définissez le modalPresentationStyle du UIViewController présenté sur .Custom et cela fonctionnera sur iOS 8 (Xcode 6.1). C'est-à-dire que vous devriez le définir dans le UIViewController

18
Patrick Bassut

J'ai essayé cette solution et cela fonctionne à la fois sur iOS 7 et 8:

if (UIDevice.currentDevice().systemVersion.integerValue >= 8)
{
    //For iOS 8
    presentingViewController.providesPresentationContextTransitionStyle = true;
    presentingViewController.definesPresentationContext = true;
    presentedViewController.modalPresentationStyle = UIModalPresentationOverCurrentContext;
}
else
{
    //For iOS 7
    presentingViewController.modalPresentationStyle = UIModalPresentationCurrentContext;
}

Remarque:Soyez conscient de la différence entre 'PresentationViewController' et 'PresentationViewController'.

11
Basem Saadawy

J'ai pu y parvenir sans code:

  1. Dans le storyboard, sur le contrôleur de vue de présentation (c'est-à-dire avant de passer à celui que vous souhaitez voir transparent), accédez à l'inspecteur des attributs. Sur cet onglet, il y a des cases à cocher pour "Contexte de définition" et "Contexte fourni". Vérifiez ceux-ci.

  2. Sur le segue, réglez-le sur "Present Modally".

  3. Sur le contrôleur de vue de destination/présentée, accédez à l'onglet d'attributs. Dans le menu déroulant "Présentation", sélectionnez "Contexte actuel".

  4. Sur le contrôleur de vue de destination, définissez sa vue pour avoir un arrière-plan clair.

  5. Sur le contrôleur de vue de destination, claquez 2 UIViews: l’un est votre "transparent", et l’autre votre "contenu". Configurez le transparent pour avoir l’alpha de votre choix et mettez tous vos déchets dans le "contenu".

6
ghostatron

Aucun de ce qui précède n'a fonctionné pour moi. Pour que cela fonctionne sur iOS 10, il suffit de: presented.modalPresentationStyle = .overFullScreen presenting.present(presented, animated: true) Ensuite, définissez la vue racine du contrôleur de vue présenté sur une couleur transparente ou semi transparente. Ne changez pas son alpha ou toutes ses sous-vues auront le même alpha.

5
Tylerc230

Je réalise la transparence avec différents styles dans Swift 2.0 en suivant les étapes ci-dessous. Analysez-le pour qu'il soit compatible avec votre code.

Le contrôleur de vue transparent (contrôleur de vue modal) est lancé par séquence lorsqu'un bouton clique sur le contrôleur de vue principal.

Réglages Segue:

 enter image description here

Dans le contrôleur de la vue principale:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) 
{
 let vc = segue.destinationViewController as! ModalViewController
 vc.modalPresentationStyle = UIModalPresentationStyle.OverCurrentContext //All objects and view are transparent
}

Contrôleur de vue modal sur StoryBoard:

  1. Si vous avez besoin de la vue et tous les objets sont transparents

 enter image description here

  1. Si vous avez besoin de visualisez uniquement en transparence et les objets ne sont pas transparents

 enter image description here

Sur votre contrôleur de vue modale

override func viewDidLoad() {
super.viewDidLoad()

view.backgroundColor = UIColor.blackColor().colorWithAlphaComponent(0.8) //view only black coloured transparent

}

Exemples de captures d'écran:

  1. La vue et sur les objets sont transparents

 enter image description here

  1. Voir seulement transparent

 enter image description here

Pour toute autre question, veuillez commenter ici :)

Si vous confondez ou plus avec contrôleur de vue transparent puis regardez mon tutoriel vidéo pour vous sur Youtube: D

4
Rajamohan S

iOS8 +

Le code ci-dessous résoudra ce problème dans iOS8 +

SecondViewController *secondViewController = [[SecondViewController alloc] init];
secondViewController.modalPresentationStyle = UIModalPresentationOverCurrentContext;           
[self presentViewController:secondViewController animated:YES completion:nil];    
2
arunjos007

J'ai eu un problème similaire, je voulais faire quelque chose de similaire à la deuxième capture d'écran que vous présentez ici (le journal brésilien/portugais!)

Je l'ai résolu comme ça. J'ai inséré un UIView couvrant l'ensemble du contrôleur de vue, puis je suis allé à l'inspecteur d'attributs et j'ai défini la couleur d'arrière-plan de UIView sur le noir, avec une opacité de 50%. Ensuite, j’ai inséré un autre UIView au-dessus du premier et j’ai travaillé sur celui-là.

0
Nahuel Roldan