ios nouveautés - Afficher UIViewController en tant que popup dans l'iPhone




12 sortie (8)

Comme il n'y a pas de réponse complète et définitive à cette question récurrente commune, je vais demander et répondre ici.

Souvent, nous devons présenter un UIViewController tel qu'il ne couvre pas le plein écran, comme dans l'image ci-dessous.

Apple fournit plusieurs UIViewController similaires, tels que UIAlertView , Twitter ou Facebook partager le contrôleur de vue, etc.

Comment pouvons-nous obtenir cet effet pour un contrôleur personnalisé?


Answers

Swift 4:

Pour ajouter une surimpression ou l'affichage contextuel Vous pouvez également utiliser la vue Conteneur avec laquelle vous obtenez un View Controller gratuit (vous obtenez la vue Conteneur à partir de la palette / bibliothèque d'objets habituelle)

Pas:

  1. Avoir une vue (ViewForContainer dans l'image) qui contient cette vue de conteneur, pour l'assombrir lorsque le contenu de la vue de conteneur est affiché. Connectez la prise à l'intérieur du premier View Controller

  2. Cacher cette vue lorsque le 1er VC charge

  3. Afficher lorsque le bouton est cliqué

  4. Pour réduire cette vue lorsque le contenu de la vue Conteneur est affiché, définissez l'arrière-plan des Vues sur Noir et l'opacité sur 30%

Vous obtiendrez cet effet lorsque vous cliquez sur le bouton


Vous pouvez le faire pour ajouter toute autre sous-vue au contrôleur de vue. Réglez d'abord la barre d'état sur None pour le ViewController que vous voulez ajouter en tant que sous-vue afin de pouvoir le redimensionner comme vous le souhaitez. Ensuite, créez un bouton dans le contrôleur Present View et une méthode pour cliquer sur le bouton. 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];
}

Espérons que cela aide, n'hésitez pas à demander si des requêtes ...


NOTE: Cette solution est cassée dans iOS 8. Je posterai une nouvelle solution dès que possible.

Je vais répondre ici en utilisant le storyboard mais c'est aussi possible sans storyboard.

  1. Init: Créez deux UIViewController dans le storyboard.

    • disons FirstViewController qui est normal et SecondViewController qui sera le popup.

  2. Modal Segue: Mettez UIButton dans FirstViewController et créez un segment sur cet UIButton à SecondViewController comme modal segue.

  3. Rendre transparent: Maintenant, sélectionnez UIView ( UIView qui est créé par défaut avec UIViewController ) de SecondViewController et changez sa couleur d'arrière-plan pour effacer la couleur.

  4. Rendre l'arrière-plan Dim: Ajouter un UIImageView dans SecondViewController qui couvre tout l'écran et définit son image à une image semi- UIImageView SecondViewController . Vous pouvez obtenir un échantillon d'ici: UIAlertView Background Image

  5. Conception d'affichage: Maintenant ajoutez un UIView et faites n'importe quel genre de conception que vous voulez montrer. Voici une capture d'écran de mon storyboard

    • Ici, j'ai ajouter segue sur le bouton de connexion qui ouvre SecondViewController comme popup pour demander le nom d'utilisateur et mot de passe
  6. Important: Maintenant, cette étape principale. Nous voulons que SecondViewController ne cache pas complètement FirstViewController. Nous avons défini une couleur claire mais cela ne suffit pas. Par défaut, il ajoute du noir derrière la présentation du modèle, donc nous devons ajouter une ligne de code dans viewDidLoad de FirstViewController . Vous pouvez également l'ajouter à un autre endroit, mais il doit être exécuté avant la lecture.

    [self setModalPresentationStyle:UIModalPresentationCurrentContext];

  7. Rejeter: Quand rejeter dépend de votre cas d'utilisation. Ceci est une présentation modale donc pour rejeter nous faisons ce que nous faisons pour la présentation modale:

    [self dismissViewControllerAnimated:YES completion:Nil];

C'est tout.....

Tout type de suggestion et de commentaire sont les bienvenus.

Démo: Vous pouvez obtenir le projet de la source de démonstration à partir d'ici: Popup Demo

NOUVEAU : Quelqu'un a fait du très bon travail sur ce concept: MZFormSheetController
Nouveau : j'ai trouvé un code de plus pour obtenir ce type de fonction: KLCPopup

iOS 8 Mise à jour : J'ai fait cette méthode pour travailler 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 ça

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {

    PopUpViewController *popup = segue.destinationViewController;
    [self setPresentationStyleForSelfController:self presentingController:popup]
}

Popups modaux dans Interface Builder (Storyboards)

Étape 1

Sur le ViewController que vous voulez utiliser comme popup contextuel, désactivez la couleur d'arrière-plan de la racine UIView. Conseil: N'utilisez pas la racine UIView comme popup. Ajoutez un nouveau UIView plus petit pour être votre popup.

Étape 2

Créer une Segue à la ViewController qui a votre popup. Sélectionnez "Présenter Modalement".

Deux méthodes pour créer un popup à partir d'ici

Méthode 1 - Utilisation du Segue

Sélectionnez le Segue et modifiez la présentation en "Contexte actuel":

Deuxième méthode - Utilisation du View Controller

Sélectionnez la scène ViewController qui est votre popup. Dans l'Inspecteur des attributs, sous la section Contrôleur de vue, définissez Présentation sur "Contexte actuel":

L'une ou l'autre méthode fonctionnera. Ça devrait le faire!


Imao mis UIImageView sur fond n'est pas la meilleure idée. Dans mon cas, j'ai ajouté sur la vue du contrôleur d'autres 2 vues. La première vue a [UIColor clearColor] sur le fond, la deuxième couleur que vous voulez être transparent (gris dans mon cas). Notez que cet ordre est important. Ensuite, pour la deuxième vue, définissez alpha 0.5 (alpha> = 0 <= 1). ceci à des lignes dans prepareForSegue

infoVC.providesPresentationContextTransitionStyle = YES;
infoVC.definesPresentationContext = YES;

Et c'est tout.


N'hésitez pas à utiliser mon contrôleur de feuille de formulaire MZFormSheetController pour iPhone, dans le projet exemple, il existe de nombreux exemples sur la façon de présenter le contrôleur de vue modale qui ne couvre pas toute la fenêtre et a de nombreux styles de présentation / transition.

Vous pouvez également essayer la dernière version de MZFormSheetController qui s'appelle MZFormSheetPresentationController et qui a beaucoup plus de fonctionnalités.


Vous pouvez utiliser EzPopup ( 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)

Essayez macincloud.com Cela vous permet de louer un mac et d'y accéder via la télécommande RDP. Vous pouvez ensuite utiliser votre PC pour accéder à un mac, puis développer vos applications.





ios iphone uiviewcontroller popup uialertview