iOS: Modal ViewController avec un fond transparent
Je suis en train de présenter une vue contrôleur modal, avec un arrière-plan transparent. Mon objectif est de permettre à la fois la présentation et présenté afficher les contrôleurs de la vue à afficher en même temps. Le problème est que, lors de la présentation de l'animation se termine, la présentation de la vue du contrôleur de la vue disparaît.
- (IBAction)pushModalViewControllerButtonPressed:(id)sender
{
ModalViewController *modalVC = [[ModalViewController alloc] init];
[self presentViewController:modalVC animated:YES completion:nil];
}
Je sais que je pourrais juste ajouter de la vue comme une sous-vue, mais je voudrais éviter cette solution pour une raison quelconque. Comment pourrais-je résoudre ce problème?
- Sonne comme Michael, comme moi, veut modale de vue à être translucide, pour apparaître comme un vol stationnaire gel de la couche de primaire (présentation) de la vue. Crée le sens de l'utilisateur de rester dans le contexte actuel, tout en faisant un réglage rapide, plutôt que d'aller dans une autre fonctionnalité majeure (dans une vue séparée).
- Cette stackoverflow.com/q/27598846/1603234 de me faire sourire, maintenant à votre tour 🙂
- Voir ma réponse ici stackoverflow.com/a/29794201/1606125 pour iOS 8
- swift version ici stackoverflow.com/a/34578402/3380878
- Pour iOS 10 travaille UIModalPresentationOverFullScreen comme inigo333 mentionnés ci-dessous.
- vc.modalPresentationStyle = UIModalPresentationOverFullScreen;
Vous devez vous connecter pour publier un commentaire.
Ce code suivant ne fonctionne que sur l'iPad.
Je voudrais aller avec l'ajout d'un sous vue.
Ici est une très bonne discussion. Regardez les commentaires, en particulier. Non seulement la réponse.
Modal Vue
Si j'étais vous, je ne le ferais pas. Je voudrais ajouter un sous vue et de le faire. Il semble me donner un meilleur contrôle sur les choses.
EDIT:
Comme mentionné par Paul Linsay, depuis iOS 8 tout ce qui est nécessaire est
UIModalPresentationOverFullScreen
pour la modalPresentationStyle de la ViewController d'être présentés. Cela permettrait également de couvrir de navigationBar et tabBar boutons.modalPresentationStyle = UIModalPresentationCurrentContext
sur le présentateur vue-contrôleur, et non pas dans le présenté une.ViewController
de votre point de vue de la hiérarchie. (eg. unNavigationController
ou de l'instance de votre diapositive menu view controller par exemple).UIModalPresentationCustom
, et seulement si, il est en droit avant depresentViewController
plutôt que dansviewDidLoad
.modalPresentationStyle
avantviewDidLoad
. Je l'ai fait dans le constructeur et cela a fonctionné.Pour ceux qui essaient d'obtenir que cela fonctionne dans iOS 8, la "approuvé par Apple" façon d'afficher une transparence modal-vue-contrôleur est par la mise en
modalPresentationStyle
sur le présented contrôleur àUIModalPresentationOverCurrentContext
.Cela peut être fait dans le code, ou en définissant les propriétés de la séquence dans le storyboard.
De la UIViewController documentation:
https://developer.apple.com/documentation/uikit/uiviewcontroller
La 'View Controller Progrès dans iOS 8' de la vidéo à partir de la WWDC 2014 va dans ce dans le détail.
Remarque:
viewDidLoad
de la presentedViewController de ne pas avoir une incidencesourceVC
estself.navigationController
. Aussi, seulement après le réglage de la cible présentation de style comme de coutume, je pouvais voir à travers elle.[sourceVC setModalPresentationStyle:UIModalPresentationCurrentContext];
,[targetVC setModalPresentationStyle:UIModalPresentationCustom];
J'espère que ça aidera quelqu'un.presentedVC.modalPresentationStyle = UIModalPresentationOverCurrentContext
dans le présentation VC. Ne fonctionne pas dans le presentedVC. Faites-moi confiance, j'ai essayé.En iOS 8.0 et au-dessus, il peut être fait par la définition de la propriété modalPresentationStyle à UIModalPresentationOverCurrentContext
.custom
et.overFullScreen
travail..overFullScreen
la vue du contrôleur deviewWillAppear
ne sera pas appelé.presentedController.view.backgroundColor = #color#
doit être écrit danspresentedController
'sviewDidLoad
, ou d'autrepresentedController
's la vie est interrompue.Ce code fonctionne très bien sur iPhone sous iOS6 et iOS7:
Dans ce cas, vous manquez de glissement de l'animation. Pour conserver l'animation, vous pouvez utiliser la suite de "non-noble" extension:
Si notre presentingV est situé à l'intérieur de UINavigationController ou UITabbarController vous avez besoin pour fonctionner avec les contrôleurs de presentingVC.
En outre, dans iOS7, vous pouvez mettre en œuvre personnalisée animation de transition appliquant
UIViewControllerTransitioningDelegate
protocole. Bien sûr, dans ce cas, vous pouvez obtenir un fond transparentD'abord, avant de vous présenter, vous devez définir
modalPresentationStyle
Ensuite, vous avez à mettre en œuvre deux protocole méthodes
La dernière chose à faire est de définir votre transition personnalisée dans
CustomAnimatedTransitioning
classemodalPresentationStyle
est mis aussi!presentingVC
àpresentingVC.navigationViewController
func tabBarController(tabBarController: UITabBarController, shouldSelectViewController viewController: UIViewController) -> Bool { self.presentedViewController?.view.backgroundColor = UIColor.redColor() self.presentingViewController?.tabBarController?.modalPresentationStyle = UIModalPresentationStyle.CurrentContext return true; }
J'ai un peu de mal avec l'Interface du Générateur de XCode 7 pour définir le Style de Présentation que @VenuGopalTewari suggéré. Dans cette version, il semble y avoir aucune
Over Current Context
ouOver Full Screen
mode de présentation de la séquence. Ainsi, pour le faire fonctionner, j'ai mis le mode deDefault
:avec
De plus, j'ai mis le mode de présentation de l'modal présenté-vue-contrôleur de
Over Full Screen
:Créer un segue à présent modal et de définir la Présentation des biens de cette séquence à plus de contexte actuel
il sera à 100 %
PresentViewController avec un fond Transparent - dans iOS 8 et iOS 9
Et dans MYViewController définir la couleur de fond en noir et réduire l'opacité
C'est un peu de hacky, mais pour moi, ce code fonctionne (iOS 6):
Ce code fonctionne aussi sur iPhone
Cette catégorie a fonctionné pour moi (ios 7, 8 et 9)
H fichier
M fichier
J'ai ajouté ces trois lignes dans la méthode init de la vue-contrôleur, et fonctionne comme un charme:
MODIFIER (travail sur iOS 9.3):
Selon la documentation:
Disponible en iOS 8.0 et versions ultérieures.
Si vous utilisez la table de montage séquentiel, vous pouvez suivre cette étape:
La solution à cette réponse à l'aide de swift serait comme suit.
Autre façon consiste à utiliser un "conteneur de vue". Juste faire de l'alpha-dessous de 1 et incorporer seque. XCode 5, cible iOS7. Testé sur iPhone.
Conteneur affichage disponible à partir de iOS6.
Lien de blog à ce sujet.
J'ai créé un objet permettant de gérer la présentation de ce que j'appelle un "superposés modal", ce qui signifie qu'il conserve l'arrière-plan de la vue et vous permet d'avoir un modal avec un fond transparent.
Il a une seule méthode simple qui ne ce:
Il est important de définir le
modalPresentationCapturesStatusBarAppearance
propriétéYES
et de la force de la barre d'état de l'apparence de mettre à jour, si votre présentés vue-contrôleur a un autrepreferredStatusBarStyle
.Cet objet doit avoir un
@property (assign, nonatommic) isPresenting
Vous voulez cet objet pour se conformer à la
UIViewControllerAnimatedTransitioning
etUIViewControllerTransitioningDelegate
protocoles et de mettre en œuvre les méthodes suivantes:et:
Ce qui fait un glisser-dans-de-la-bas d'animation imitant la valeur par défaut modal de l'animation, mais vous pouvez faire ce que vous voulez.
La chose importante est que la présentation de la vue du contrôleur de vue reste à l'arrière, vous permettant de créer un effet transparent.
Cette solution fonctionne pour iOS 7+
Une manière très simple de le faire (à l'aide de
Storyboards
, par exemple) est:C'est un
UIViewController
dans unStoryboard
modal, mais avec un translucide arrière-plan.Pour récapituler toutes les bonnes réponses et les commentaires ici et d'avoir encore une animation tout en se déplaçant à votre nouvelle
ViewController
c'est ce que j'ai fait: (prend en charge iOS 6 et plus)Si votre utilisation d'un
UINavigationController
\UITabBarController
c'est le chemin à parcourir:Si vous allez faire que vous allez perdre votre
modalTransitionStyle
animation. Pour le résoudre, vous pouvez facilement ajouter à votreSomeViewController
classe ce:De travail pour iOS 7 à 10
De sûr, vous devriez définir UIModalPresentationCurrentContext, mais l'endroit pour installer clearColor est très important aussi! Vous ne pouvez pas choisir la couleur de fond dans le viewDidLoad fonction, réglez-le avant que la vue ne charge comme dans le vue de la racine contrôleur ou dans le fonction init du contrôleur qui va présenter!
ou
Si vous utilisez modal segue, assurez-vous de le définir comme cette image (vous pouvez désactiver l'animation si vous le souhaitez)
Une méthode complète testé sur iOS 7 et iOS 8.
Swift 4.2
dans appdelegate :
dans vous premier-vue-contrôleur à partir de l'endroit où vous devez charger la vue suivante:
dans votre nextViewController qui est d'être transparent ajouté:
Nous devons fixer notre Modal correctement.
lien de l'image cible
Tout d'abord, nous devons modifier la Vue du Contrôleur de la Vue arrière-plan de couleur Claire. Cela signifie simplement qu'il doit être transparent. Par défaut, ce point de Vue, il est blanc.
Deuxièmement, nous avons besoin de sélectionner la Séquence qui mène à l'écran de Connexion, et dans l'Attribut de l'Inspecteur, définir la Présentation de Plus de Contexte Actuel. Cette option est uniquement disponible avec Mise en page Automatique et de la Taille des Classes de permis.
lien de l'image cible
Ensemble de la navigation
modalPresentationStyle
àUIModalPresentationCustom
et de définir votre présentés vue du contrôleur de la couleur d'arrière-plan couleur claire.