Comme il n’ya pas de réponse complète et définitive à cette question récurrente, je vais vous demander de répondre ici.
Nous avons souvent besoin de présenter un UIViewController
tel qu’il ne couvre pas le plein écran, comme dans l’illustration ci-dessous.
Apple fournit plusieurs UIViewController
similaires, tels que UIAlertView
, le contrôleur de partage de partage Twitter ou Facebook, etc.
Comment pouvons-nous obtenir cet effet pour un contrôleur personnalisé?
NOTE: Cette solution est cassée dans iOS 8. Je vais publier une nouvelle solution dès que possible.
Je vais répondre ici en utilisant le storyboard, mais c'est également possible sans storyboard.
Init: Créez deux UIViewController
dans le storyboard.
FirstViewController
qui est normal et SecondViewController
qui sera le popup .Modal Segue: Mettez UIButton
dans FirstViewController et créez une segue sur cette UIButton
à SecondViewController
en tant que transition modale.
Rendre transparent: Sélectionnez maintenant UIView
(UIView
qui est créé par défaut avec UIViewController
) de SecondViewController
et changez sa couleur d'arrière-plan en couleur claire.
Rendre l'arrière-plan Dim: Ajouter une UIImageView
dans SecondViewController
qui couvre tout l'écran et définit son image sur une image semi-transparente atténuée. Vous pouvez en obtenir un exemple ici: UIAlertView
Background Image
Conception d'affichage: Ajoutez maintenant une UIView
et créez le type de conception que vous souhaitez afficher. Voici une capture d'écran de mon storyboard
SecondViewController
en popup pour demander le nom d’utilisateurImportant: Maintenant cette étape principale. Nous voulons que SecondViewController
ne cache pas FirstViewController complètement. Nous avons défini la couleur claire mais cela ne suffit pas. Par défaut, il ajoute du noir derrière la présentation du modèle. Nous devons donc ajouter une ligne de code dans viewDidLoad of FirstViewController
. Vous pouvez aussi l'ajouter à un autre endroit, mais il devrait être exécuté avant le début du match.
[self setModalPresentationStyle:UIModalPresentationCurrentContext];
Rejeter: Quand rejeter dépend de votre cas d'utilisation. Ceci est une présentation modale, donc pour écarter nous faisons ce que nous faisons pour la présentation modale:
[self dismissViewControllerAnimated:YES completion:Nil];
C'est tout.....
Toute suggestion ou commentaire est le bienvenu.
Démo: Vous pouvez obtenir un projet source de démonstration à partir d’ici: Démo Popup
NEW: Quelqu'un a fait du très beau travail sur ce concept: MZFormSheetController
Nouveau: J'ai trouvé un code supplémentaire pour obtenir ce genre de fonction: KLCPopup
Mise à jour iOS 8: cette méthode est compatible avec iOS 7 et iOS 8
+ (void)setPresentationStyleForSelfController:(UIViewController *)selfController presentingController:(UIViewController *)presentingController
{
if (iOSVersion >= 8.0)
{
presentingController.providesPresentationContextTransitionStyle = YES;
presentingController.definesPresentationContext = YES;
[presentingController setModalPresentationStyle:UIModalPresentationOverCurrentContext];
}
else
{
[selfController setModalPresentationStyle:UIModalPresentationCurrentContext];
[selfController.navigationController setModalPresentationStyle:UIModalPresentationCurrentContext];
}
}
Peut utiliser cette méthode dans prepareForSegue deligate comme ceci
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
PopUpViewController *popup = segue.destinationViewController;
[self setPresentationStyleForSelfController:self presentingController:popup]
}
Sur le ViewController que vous voulez comme fenêtre contextuelle modale, clarifiez la couleur d’arrière-plan de la racine UIView . Astuce: N'utilisez pas la racine UIView en tant que fenêtre contextuelle. Ajoutez une nouvelle UIView plus petite pour être votre popup.
Créez un lien vers le ViewController qui contient votre popup. Sélectionnez "Présenter Modalement" .
Sélectionnez le Segue et changez Presentation en "Over Current Context":
Sélectionnez la scène ViewController qui est votre popup. Dans l'Inspecteur des attributs, sous la section Afficher le contrôleur, définissez Présentation sur "Contexte actuel":
L'une ou l'autre méthode fonctionnera. Ça devrait le faire!
Vous pouvez le faire dans Interface Builder.
N'hésitez pas à utiliser mon contrôleur de feuille/ MZFormSheetController pour iPhone, dans l'exemple de projet, il existe de nombreux exemples sur la manière de présenter le contrôleur de vue modale qui ne couvrira pas toute la fenêtre et comporte de nombreux styles de présentation/transition.
Vous pouvez également essayer la dernière version de MZFormSheetController appelée MZFormSheetPresentationController et bénéficier de nombreuses autres fonctionnalités.
Vous pouvez utiliser EzPopup ( https://github.com/huynguyencong/EzPopup ), c’est un pod Swift et très facile à utiliser:
// init YourViewController
let contentVC = ...
// Init popup view controller with content is your content view controller
let popupVC = PopupViewController(contentController: contentVC, popupWidth: 100, popupHeight: 200)
// show it by call present(_ , animated:) method from a current UIViewController
present(popupVC, animated: true)
Imao a mis UIImageView en arrière-plan n’est pas la meilleure idée. Dans mon cas, j'ai ajouté sur le contrôleur voir 2 autres vues. La première vue a [UIColor clearColor]
sur le fond, la deuxième couleur qui doit être transparente (gris dans mon cas). Notez que l’ordre est important. en prepareForSegue
infoVC.providesPresentationContextTransitionStyle = YES;
infoVC.definesPresentationContext = YES;
Et c'est tout.
Vous pouvez le faire pour ajouter une autre sous-vue au contrôleur de vue . Définissez d'abord la barre d'état sur Aucune pour ViewController que vous souhaitez ajouter en tant que sous-vue afin de pouvoir redimensionner à votre guise. Créez ensuite un bouton dans le contrôleur de la vue actuelle et une méthode de clic. Dans la méthode:
- (IBAction)btnLogin:(id)sender {
SubView *sub = [[SubView alloc] initWithNibName:@"SubView" bundle:nil];
sub.view.frame = CGRectMake(20, 100, sub.view.frame.size.width, sub.view.frame.size.height);
[self.view addSubview:sub.view];
}
J'espère que cela vous aidera, n'hésitez pas à demander si vous avez des questions ...
Swift 4:
Pour ajouter une superposition ou la vue contextuelleVous pouvez également utiliser la vue vue conteneur avec laquelle vous obtenez un contrôleur de vue gratuit (vous obtenez la vue conteneur de la palette/bibliothèque d'objets habituelle)
Pas:
Avoir une vue (ViewForContainer dans l'image) contenant cette vue Conteneur, pour l'assombrir lorsque le contenu de la vue Conteneur est affiché. Connectez la prise à l'intérieur du premier View Controller
Masquer cette vue lorsque le premier VC est chargé
Pour assombrir cette vue lorsque le contenu de la vue conteneur est affiché, définissez l'arrière-plan de la vue sur noir et l'opacité sur 30%.
Vous obtiendrez cet effet lorsque vous cliquerez sur le bouton