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?
Réponses:
Ce code suivant ne fonctionne que sur l'iPad.
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
UIModalPresentationOverFullScreen
le modalPresentationStyle du ViewController présenté. Cela couvrirait également les boutons navigationBar et tabBar.la source
modalPresentationStyle = UIModalPresentationCurrentContext
sur le présentateur contrôleur de vue, et non dans la présente un.ViewController
de votre hiérarchie de vues. (par exemple, aNavigationController
ou l'instance de votre contrôleur d'affichage du menu des diapositives par exemple).UIModalPresentationCustom
, et uniquement s'il est défini juste avantpresentViewController
plutôt que dansviewDidLoad
.modalPresentationStyle
avantviewDidLoad
. Je l'ai fait dans le constructeur et cela a fonctionné.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 surUIModalPresentationOverCurrentContext
.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:
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:
viewDidLoad
de la présentationViewController n'aura aucun effetla source
sourceVC
c'estself.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.presentedVC.modalPresentationStyle = UIModalPresentationOverCurrentContext
le VC de présentation . Ne fonctionne pas dans le presentVC. Croyez-moi, j'ai essayé.Dans iOS 8.0 et supérieur, cela peut être fait en définissant la propriété modalPresentationStyle sur UIModalPresentationOverCurrentContext
la source
.custom
et.overFullScreen
fonctionne..overFullScreen
le contrôleur de vue actuel, le contrôleur neviewWillAppear
sera pas appelé.presentedController.view.backgroundColor = #color#
devrait être écrite danspresentedController
'sviewDidLoad
, sinonpresentedController
la vie de s est interrompue.Ce code fonctionne très bien sur iPhone sous iOS6 et iOS7:
Dans ce cas, vous manquez une animation de diapositives. Pour conserver l'animation, vous pouvez toujours utiliser l'extension "non élégante" suivante:
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
UIViewControllerTransitioningDelegate
protocole d' application d'animation de transition personnalisée . Bien sûr, dans ce cas, vous pouvez obtenir un fond transparentTout d'abord, avant de présenter, vous devez définir
modalPresentationStyle
Ensuite, vous devez implémenter deux méthodes de protocole
La dernière chose est de définir votre transition personnalisée en
CustomAnimatedTransitioning
classela source
modalPresentationStyle
est réglé aussi!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 Context
ou deOver Full Screen
présentation pour la suite. Ainsi, pour que cela fonctionne, j'ai réglé le mode surDefault
:avec
De plus, j'ai défini le mode de présentation du contrôleur de vue présenté modalement sur
Over Full Screen
:la source
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%
la source
PresentViewController avec fond transparent - sous iOS 8 et iOS 9
Et dans MYViewController, définissez la couleur d'arrière-plan noire et réduisez l'opacité
la source
C'est un peu hacky, mais pour moi ce code fonctionne (iOS 6):
Ce code fonctionne également sur iPhone
la source
Cette catégorie a fonctionné pour moi (iOS 7, 8 et 9)
Fichier H
Dossier M
la source
La solution à cette réponse en utilisant swift serait la suivante.
la source
Si vous utilisez Storyboard, vous pouvez suivre cette étape:
la source
J'ai ajouté ces trois lignes dans la méthode init dans le contrôleur de vue présenté et fonctionne comme un charme:
EDIT (fonctionnant sous iOS 9.3):
Selon la documentation:
Disponible dans iOS 8.0 et versions ultérieures.
la source
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.
Vue conteneur disponible depuis iOS6. Lien vers l'article de blog à ce sujet.
la source
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:
Il est important de définir la
modalPresentationCapturesStatusBarAppearance
propriété surYES
et 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
UIViewControllerAnimatedTransitioning
etUIViewControllerTransitioningDelegate
protocoles et mettre en œuvre les méthodes suivantes:et:
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+
la source
Une manière très simple de faire cela (en utilisant
Storyboards
, par exemple) est:Cela présentera un
UIViewController
dans unStoryboard
modal, mais avec un fond translucide.la source
Travailler pour iOS 7-10
la source
Pour récapituler toutes les bonnes réponses et commentaires ici et pour avoir encore une animation tout en passant à votre nouveau, voici
ViewController
ce que j'ai fait: (Prend en charge iOS 6 et plus)Si vous utilisez un
UINavigationController
\,UITabBarController
c'est la voie à suivre:Si vous faites cela, vous perdrez votre
modalTransitionStyle
animation. Afin de le résoudre, vous pouvez facilement ajouter à votreSomeViewController
classe ceci:la source
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!
ou
la source
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)
la source
Une méthode complète testée sur iOS 7 et iOS 8.
la source
Swift 4.2
la source
dans appdelegate:
dans votre premier contrôleur de vue à partir duquel vous devez charger la vue suivante:
dans votre nextViewController qui doit être ajouté transparent:
la source
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
la source
Définir la navigation
modalPresentationStyle
surUIModalPresentationCustom
et définissez la couleur d'arrière-plan de votre contrôleur de vue présenté comme couleur claire.
la source