Dans le tutoriel précédent, j'avais expliqué quelques nouvelles fonctionnalités d'iOS 7 qui vous permettaient d'ajouter des animations subtiles et une plus grande interactivité avec étonnamment peu de code pour simuler la physique du monde réel. Dans ce tutoriel, je vais vous montrer comment créer un formulaire masqué sur une page de résultats de recherche..
Nous utiliserons un comportement de gravité et un comportement de collision pour déterminer si le formulaire est actuellement visible ou non. Nous aurons également une animation subtile de rebond gratuitement lorsque le panneau apparaîtra à la vue. Commençons.
Ouvrez Xcode et sélectionnez Nouveau> Projet… du Fichier menu. Choisir Application à vue unique de la liste des Application iOS modèles et cliquez Suivant.
Entrez un nom pour votre projet, j'ai appelé le mien Dynamique. Entrez le nom de votre organisation, l'identifiant de l'entreprise et le préfixe de la classe. Choisir iPhone du Dispositifs liste, cliquez Suivant, et choisissez un emplacement pour enregistrer le projet.
Ouvrir Tableau principal et supprimer le contrôleur de vue qui est là par défaut.
Faites glisser un Contrôleur de navigation du Bibliothèque d'objets. Xcode 5, le contrôleur de vue racine du contrôleur de navigation est par défaut un UITableViewController
exemple. Sélectionnez le contrôleur de vue de table et supprimez-le. Nous allons créer un contrôleur de vue personnalisé pour ce projet..
Faites glisser un Contrôleur de vue du Bibliothèque d'objets et placez-le à gauche du contrôleur de navigation. Cliquez avec le bouton droit sur le contrôleur de navigation pour afficher le Inspecteur de connexions. Cliquez sur le plus à gauche de contrôleur de vue racine et choisissez le contrôleur de vue que vous venez d'ajouter.
Sélectionnez l'élément de navigation du contrôleur de vue et remplacez le titre par Résultats de la recherche dans le Inspecteur d'attributs sur la droite.
Générez et exécutez le projet pour vous assurer que les vues et les contrôleurs de vue sont correctement connectés..
Ouvrez dans le fichier d'en-tête du contrôleur de vue le navigateur de projet. Ajouter un UITableView
propriété, un UIView
propriété pour la vue formulaire, un UIBarButtonItem
pour le bouton pour afficher le formulaire, et un UIButton
cacher le formulaire. Ajouter une action pour le UIBarButtonItem
ainsi qu'une action pour le UIButton
.
La classe de contrôleur de vue doit également se conformer à la UITableViewDataSource
et UITableViewDelegate
protocoles. Le fichier d'en-tête du contrôleur de vue devrait maintenant ressembler à ceci:
#importation@interface ViewController: UIViewController @property (nonatomic, faible) IBOutlet UITableView * tableView; @property (nonatomic, faible) IBOutlet UIView * filterFormView; @property (nonatomic, faible) IBOutlet UIBarButtonItem * filterButton; @property (nonatomic, faible) IBOutlet UIButton * applyFilterButton; - (IBAction) filterButtonTapped; - (IBAction) applyFilterButtonTapped; @fin
Dans le fichier d'implémentation du contrôleur de vue, éditez le viewDidLoad
méthode. Après [super viewDidLoad]
, dis le UITableView
exemple d'utiliser le UITableViewCell
classe à peupler elle-même:
[self.tableView registerClass: [classe UITableViewCell] pourCellReuseIdentifier: @ "Cell"];
Ensuite, implémentez le UITableViewDataSource
protocole dans le fichier d'implémentation du contrôleur de vue. Le tableau doit comporter une section, 100 lignes et chaque ligne doit afficher le numéro de ligne de la cellule..
- (NSInteger) numberOfSectionsInTableView: (UITableView *) tableView return 1; - (NSInteger) tableView: (UITableView *) tableView numberOfRowsInSection: (NSInteger) section return 100; - (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier: @ "Cell"]; cell.textLabel.text = [NSString stringWithFormat: @ "% ld", (long) indexPath.row]; cellule de retour;
Revisiter Tableau principal et sélectionnez le contrôleur de vue que nous avons ajouté précédemment. Changer sa classe en ViewController
dans le Inspecteur d'identité afin que nous puissions connecter les points de vente que nous avons créés plus tôt.
Faites glisser un UITableView
exemple de la Bibliothèque d'objets dans la vue du contrôleur de vue. Assurez-vous que la vue de table se trouve en haut du contrôleur de vue et la couvre complètement. Utilisez le Inspecteur de connexions pour définir le contrôleur de vue en tant que vue de la table la source de données et déléguer.
Générez et exécutez votre application. Vous devriez voir un tableau avec 100 lignes contenant, chaque ligne affichant son numéro de ligne.
Dans Tableau principal faites glisser un UIView
exemple au contrôleur de vue. Assurez-vous que la vue n'est pas ajoutée en tant qu'en-tête de la vue de table. Vous pouvez le vérifier en ouvrant le Sommaire du document à gauche et en vérifiant que la vue que vous venez d'ajouter est un pair de la vue table, pas une sous-vue.
Définissez la couleur d'arrière-plan de la vue sur gris clair, son origine sur (0.0, 0.0)
, et sa taille à (320.0, 568.0)
de sorte qu'il remplisse tout l'écran, couvrant la vue de la table.
Accrochez cette vue au filterFormView
sortie que nous avons déclaré dans le fichier d'en-tête du contrôleur de vue.
Ajoutez quelques contrôles à la vue, imaginez que ce soit un formulaire pour filtrer les résultats de la recherche présentés dans la vue tableau. Ajoutez un certain nombre de champs de texte et un bouton, comme indiqué dans la capture d'écran ci-dessous..
Connectez le Appliquer bouton avec le applyFilterButton
sortie nous avons déclaré plus tôt et connectez le Retouche à l'intérieur événement au applyFilterButtonTapped
action.
Revisitez le fichier d'implémentation du contrôleur de vue et ajoutez une déclaration de méthode vide pour applyFilterButtonTapped
de sorte que l'application ne plante pas si vous appuyez accidentellement sur le bouton.
- (void) applyFilterButtonTapped
Générez et exécutez votre application. Vous devriez voir le formulaire couvrant la vue de table.
Ajouter un UIBarButtonItem
exemple à la barre de navigation. Changer son titre en Filtre et connectez-le au filtreButton
sortie nous avons déclaré dans le fichier d'en-tête du contrôleur de vue. Connectez le filterButtonTapped
action à la filtreButton
élément de bouton de barre.
Revenez dans le fichier d'implémentation du contrôleur de vue et ajoutez une déclaration de méthode vide pour filterButtonTapped
de sorte que l'application ne se bloque pas si vous appuyez sur l'élément de bouton de barre.
- (void) filterButtonTapped
Avant d'ajouter des comportements dynamiques, il est utile de prendre une seconde pour réfléchir à ce que nous voulons que nos comportements fassent et à la façon dont nous pouvons y parvenir..
Lorsque le formulaire de filtre n'est pas visible, il devrait être hors écran. Nous pouvons utiliser un Comportement de gravité
agir à la hausse pour l'empêcher de tomber. Quand le Filtre le bouton est exploité, la gravité devrait commencer à agir vers le bas, la forme devenant visible à la suite.
Nous avons aussi besoin d'un UICollisionBehavior
avec des limites de sorte que le formulaire monte pour être juste hors écran et ne tombe que jusqu'au bas de l'écran. La capture d'écran suivante montre les deux états finaux du formulaire, les lignes roses indiquant les limites de la collision. Traduisons cela en code.
Dans ViewController.h déclarer un UIDynamicAnimator
propriété. Nous transmettrons nos comportements à cet animateur, qui déterminera ce qui doit se passer avec la vue formulaire. Déclarer un Comportement de gravité
et un UICollisionBehavior
.
@property (nonatomic, strong) UIDynamicAnimator * animateur; @property (nonatomic, strong) UIGravityBehavior * gravité; @property (nonatomic, strong) UICollisionBehavior * collision;
Dans viewDidLoad
, initialiser animateur
en tant qu'animateur dynamique avec la vue du contrôleur de vue comme vue de référence. Ensuite, initialisez la gravité
et configurez-le pour agir dans une direction ascendante avec un angle de -M_PI_2
sur le filterForm
vue.
Il est maintenant temps d'initialiser le contrôleur de vue collision
propriété en invoquant initWithItems:
et en passant un tableau avec seulement self.filterForm
en elle. Nous ajoutons deux limites, une en bas de la vue et une en haut de la vue. C’est ainsi que la mise en œuvre mise à jour de viewDidLoad
ressemble à:
- (void) viewDidLoad [super viewDidLoad]; [self.tableView registerClass: [classe UITableViewCell] pourCellReuseIdentifier: @ "Cell"]; self.animator = [[UIDynamicAnimator alloc] initWithReferenceView: self.view]; self.gravity = [[UIGravityBehavior alloc] initWithItems: @ [self.filterFormView]]; self.gravity.angle = -M_PI_2; [self.animator addBehavior: self.gravity]; self.collision = [[UICollisionBehavior alloc]] initWithItems: @ [self.filterFormView]]; [self.collision addBoundaryWithIdentifier: @ "TopOfView" dePoint: CGPointMake (0., -self.filterFormView.bounds.size.height) versPoint: CGPointMake (self.view.bounds.size.width, -self.filterFormView.bounds.size) .la taille)]; [self.collision addBoundaryWithIdentifier: @ "BottomOfView" fromPoint: CGPointMake (0., self.view.bounds.size.height) toPoint: CGPointMake (self.view.bounds.size.width, self.view.bounds.size.height )]; [self.animator addBehavior: self.collision];
Lorsque vous appuyez sur le bouton du filtre, nous voulons le désactiver pour éviter toute confusion de l'utilisateur. Nous souhaitons également que la gravité commence à agir de manière descendante pour que le formulaire soit visible. Mettre à jour le filterButtonTapped
action comme suit:
Quand le Appliquer appuyez sur le bouton de la vue formulaire, nous voulons que la gravité commence à agir à nouveau pour s’assurer que le formulaire glisse hors de l’écran. Nous activons également le Filtre bouton à nouveau. Mettre à jour le applyFilterButtonTapped
action comme suit:
- (void) applyFilterButtonTapped self.gravity.angle = -M_PI_2; self.filterButton.enabled = YES;
Avant de générer et d'exécuter le projet pour la dernière fois, déplaçons le formulaire de filtre hors de l'écran afin que les utilisateurs ne voient pas la diapositive de formulaire hors de l'écran lors du lancement de l'application. Met le y
position pour la vue de forme de filtre à -568
.
Créez et exécutez l'application. Appuyez sur le Filtre bouton et la forme doit glisser dans la vue, tombant en place avec un léger rebond. Appuyez sur le Appliquer bouton et regarder la forme glisser doucement hors écran à nouveau.
Il a fallu un peu de travail pour configurer l'interface utilisateur, mais une fois que nous avions terminé, il était très difficile d'ajouter une animation basée sur la physique. Il ne nous a fallu que quelques lignes de code.
Nous n'avions pas besoin de coder le fonctionnement de la physique, telle que le rebond. Grâce à UIKit Dynamics, il nous suffisait de spécifier les comportements souhaités et de laisser le UIDynamicAnimator
objet faire le travail pour nous.