SDK iOS Ajout d'une table des matières à un lecteur iPad

Ceci est le troisième volet d'une série sur la création d'un lecteur PDF iPad pour le livre La guerre des mondes. Dans le tutoriel d'aujourd'hui, je vais vous montrer comment ajouter une table des matières au projet. Pour ce faire, je traiterai du travail avec les fichiers Plist, des superpositions de sous-vues, des animations de base UIView et de la création manuelle de composants d'interface..

Où nous nous sommes laissés

Dans le tutoriel de la semaine dernière, j'ai montré comment ajouter un UISlider au projet qui permettrait à l'utilisateur de "frotter" rapidement vers l'avant ou vers l'arrière dans le La guerre des mondes PDF. Cette fonctionnalité est essentielle pour tout lecteur de PDF, mais elle impose toujours une lourde charge à l'utilisateur qui souhaite naviguer dans un chapitre ou une section spécifique. Par conséquent, l'ajout d'une table des matières (ci-après simplement désignée par "TOC") semblait être la prochaine étape logique et, dans un sondage joint au dernier tutoriel, 68% de nos lecteurs ont voté en faveur de cette démarche. Dans les étapes couvertes aujourd'hui, je vais vous montrer comment faire exactement cela.

Il est important de noter que le La guerre des mondes texte que ce tutoriel utilise ne fait pas déjà une page de table des matières dans le document PDF. Par conséquent, nous allons nous concentrer sur la création de notre propre table des matières UIView.

Une dernière remarque avant de commencer: jusqu’à présent, ce didacticiel s’appuyait principalement sur Interface Builder pour la configuration et la création d’UI. Dans cette leçon, je m'éloignerai d'Interface Builder pour créer quelques nouveaux composants d'interface UIKit par programme dans notre contrôleur de vue principal. Je préfère parfois gérer la création d'interface de cette façon, alors j'ai pensé la montrer comme une approche alternative à des fins éducatives. Il suffit de réaliser que tous les composants UIKit que je crée dans le code auraient pu être créés dans Interface Builder et décompactés à partir d'un fichier NIB..

Étape 1: Créer le bouton TOC

Les meilleures applications de lecture pour iPad fournissent aux utilisateurs un bouton cohérent qui permet de passer directement à la table des matières du livre. Nous ferons la même chose ici en ajoutant un UIButton en haut à droite de l'affichage du livre. Nous pourrions facilement faire de ce bouton une icône ou le peindre avec un simple dégradé, mais nous garderons les choses simples. Le bouton aura un arrière-plan transparent, un texte bleu et le texte "Contenu" comme titre..

Pour commencer, ouvrez WOTWViewController.h et ajoutez le membre de données suivant:

 @interface WOTWViewController: LeavesViewController CGPDFDocumentRef bookPDF; UIButton * contentsButton; UISlider * pageSlider; 

Dans le fichier d'interface, déclarez qu'une méthode est responsable de la création manuelle du bouton:

  @property (nonatomic, keep) IBOutlet UISlider * pageSlider; - (vide) loadPDF; - (vide) addContentsUIButton;

Ensuite, passez à la WOTWViewController.m déposer et coder le addContentsUIButton méthode:

 - (void) addContentsUIButton if (! contentsButton) // Initialisation de base contentsButton = [[UIButton alloc] initWithFrame: CGRectMake (460.0f, 5.0f, 100.0f, 45.0f)]; [contentsButton setTitle: @ "Contents" forState: UIControlStateNormal]; [contentsButton setTitleColor: [UIColor blueColor] pourState: UIControlStateNormal]; [contentsButton setTitleColor: [UIColor redColor] pourState: UIControlStateHighlighted]; contentsButton.backgroundColor = [UIColor clearColor]; // Lorsque le bouton est exploité, déclenchez la méthode "displayTableOfContents" [contentsButton addTarget: auto action: @selector (displayTableOfContents) forControlEvents: UIControlEventTouchUpInside]; // Masque le bouton par défaut car il ne devrait pas apparaître sur le contenu de la couverture du livreButton.hidden = YES; // Ajoute le bouton en tant que sous-vue de LeavesView [self-> leavesView addSubview: contentsButton]; 

Etant donné qu'un seul bouton de contenu doit exister à la fois, nous commençons cette méthode à la ligne 3 en vérifiant que nous n'avons pas déjà créé et ajouté ce bouton à la vue Feuilles. Si tel est le cas, l’appel de méthode n’exécutera tout simplement pas le code de création de bouton..

Les lignes 5 à 10 sont plusieurs déclarations de création de bouton standard. Il est à noter que la ligne 6 appelle le -initWithFrame: méthode, qui est l'initialiseur désigné pour UIButton, et configure le bouton pour qu'il ait une valeur d'axe x de 460, une valeur d'axe y de 5, une largeur de 100 et une hauteur de 45. Il est également intéressant de noter que Titre et le titreCouleur propriétés de UIButton dépendent de l'état. Cela vous permet de répondre visuellement à des événements tels que l'activation ou la désactivation du bouton..

Si vous n'aviez auparavant créé que des boutons avec Interface Builder, les choses deviennent un peu plus intéressantes à la ligne 12. Cette ligne montre comment définir manuellement le sélecteur à appeler pour l'un des divers événements de contrôle de bouton. Si vous vous demandiez comment Interface Builder avait pu atteindre cet objectif, cela devrait être un peu plus clair maintenant..

Ensuite, la propriété masquée du bouton est définie sur "OUI". En effet, le lecteur se charge initialement avec la couverture du livre affichée et il ne semble pas approprié d'afficher le lien vers la table des matières avant au moins la page suivante..

Sur la ligne 19, nous ajoutons notre nouveau produit UIButton directement au LeavesView objet en tant que sous-vue. Il semble logique que ce bouton fasse partie de LeavesView, ce qui nous évitera de choisir de basculer entre LeavesView et le bouton de contenu lorsque la table des matières est affichée. Il est également possible d'intégrer le bouton de contenu à l'animation de la table des matières en adoptant cette approche (pour plus d'informations à ce sujet plus tard).

Bien sûr, nous n’avons pas encore terminé. Nous devons encore appeler cette méthode quelque part dans le cycle de vie du programme et nous devons également relâcher le bouton que nous avons attribué..

Sauter à la -viewDidLoad méthode pour ajouter le bouton avec cette ligne de code:

- (void) viewDidLoad

 [auto addContentsUIButton];

Cela semble être un bon endroit pour ajouter le bouton TOC, mais vous vous demandez pourquoi je me soucie d'utiliser un appel de méthode au lieu d'écrire simplement le code dans cette méthode au départ? Quand j'ai créé cette fonctionnalité pour la première fois, je l'ai fait. Cependant, en ajoutant initialement tout le code directement dans viewDidLoad, les choses se sont vraiment compliquées et il était plus difficile de se faire une idée générale de ce qui se passait pendant le cycle de vie d'une application. Le fractionnement de gros morceaux de code en méthodes indépendantes a résolu ce problème et a rendu le projet plus compréhensible et plus facile à gérer..

Parce que nous avons attribué le bouton de contenu de viewDidLoad, nous devrions également le publier dans les deux -viewDidUnload et -dealloc.

- (void) viewDidUnload

 [version du contenu du bouton], contenu du bouton = nil;

- (vide) dealloc

 [contenuBoutton release];

Rappelons d'en haut que nous avons mis la contenuButton être caché initialement. Nous devons ajouter quelques lignes de code à la LeavesView méthode déléguée -leavesView: didTurnToPageAtIndex: pour afficher le bouton de contenu après que l'utilisateur ne soit plus sur la page de couverture. Cela est assez simple:

 - (void) leavesView: (LeavesView *) leavesView didTurnToPageAtIndex: (NSUInteger) pageIndex if ((int) self.pageSlider.value! = pageIndex) self.pageSlider.value = (float) pageIndex;  if (pageIndex> 0) contentsButton.hidden = NO;  else contentsButton.hidden = YES; 

Si vous générez et exécutez le projet à ce stade, vous devriez voir le bouton de contenu en surimpression dans le coin supérieur droit de la vue du livre. Cependant, si vous appuyez sur le bouton, l'application se bloquera car nous n'avons pas encore implémenté la displayTableOfContents sélecteur l'action du bouton va essayer d'appeler.

Étape 2: Créer la table des matières UIView

Avec le bouton de contenu en place, il est temps de vous concentrer sur la création de la vue de la table des matières. Nous allons suivre la même approche que celle utilisée ci-dessus, alors revenons à la WOTWViewController.h fichier et ajoutez le membre de données suivant:

 UIView * tableOfContentsView;

Ensuite, déclarez une méthode pour gérer l’ajout de la table des matières à LeavesView:

 - (void) addTableOfContentsUIView;

Maintenant, allez à WOTWViewController.m et ajoutez le code nécessaire pour créer la table des matières UIView:

 - (void) addTableOfContentsUIView if (! tableOfContentsView) // Créez la table des matières UIView. Contiendra tous les objets de la table des matières en tant que sous-vues. tableOfContentsView = [[UIView alloc] initWithFrame: CGRectMake (0.0f, 0.0, 563.0f, 845.0f)]; tableOfContentsView.backgroundColor = [UIColor whiteColor]; // Crée le titre du livre. Centrer sur le COT en haut. UILabel * bookHeading = [[UILabel alloc] initWithFrame: CGRectMake (170.0f, 30.0f, 300.0f, 40.0f)]; bookHeading.font = [UIFont font fontWithName: @ "Arial" taille: 24.0f]; bookHeading.text = @ "GUERRE DES MONDES"; bookHeading.textColor = [UIColor blackColor]; bookHeading.backgroundColor = [UIColor whiteColor]; [bookHeading sizeToFit]; [tableOfContentsView addSubview: bookHeading]; [bookHeading release]; // Ajouter le sous-en-tête "LIVRE I" comme en-tête de colonne de gauche UILabel * bookOneSubtitle = [[UILabel alloc] initWithFrame: CGRectMake (105.0f, 70.0f, 150.0f, 40.0f)]; bookOneSubtitle.font = [UIFont fontWithName: @ "Arial" size: 22.0f]; bookOneSubtitle.text = @ "LIVRE I"; bookOneSubtitle.textColor = [UIColor blackColor]; bookOneSubtitle.backgroundColor = [UIColor whiteColor]; [bookOneSubtitle sizeToFit]; [tableOfContentsView addSubview: bookOneSubtitle]; [publication de bookOneSubtitle]; // Ajouter le sous-en-tête "BOOK II" comme en-tête de colonne de droite UILabel * bookTwoSubtitle = [[UILabel alloc] initWithFrame: CGRectMake (375.0f, 70.0f, 150.0f, 40.0f)]; bookTwoSubtitle.font = [UIFont fontWithName: @ "Arial" taille: 22.0f]; bookTwoSubtitle.text = @ "LIVRE II"; bookTwoSubtitle.textColor = [UIColor blackColor]; bookTwoSubtitle.backgroundColor = [UIColor whiteColor]; [bookTwoSubtitle sizeToFit]; [tableOfContentsView addSubview: bookTwoSubtitle]; [publication de bookTwoSubtitle]; // Ajoute la table des matières directement à la vue Feuilles, mais la cache au "calque" 0 [self-> leavesView insertSubview: tableOfContentsView atIndex: 0]; 

La méthode ci-dessus crée un modèle de base pour la vue TOC. Les dimensions de la vue sont identiques à celles de l'affichage livre / PDF et j'ai ajouté trois étiquettes: un titre de livre, un en-tête secondaire pour "Livre 1" et un en-tête secondaire pour "Livre 2". Cela peut sembler un peu étrange: n'est pas La guerre des mondes un livre? Il est publié en un volume aujourd'hui, mais il a d'abord été imprimé en tant que série de magazines et a pris le format de "Livre 1" et "Livre 2". Parce que c'est le format utilisé par le PDF, c'est aussi ce que j'ai intégré à la table des matières..

Si vous comprenez comment nous avons géré la création du bouton de contenu à l'étape précédente, la plupart du code ci-dessus devrait vous sembler logique. La seule remarque supplémentaire intéressante est que j'ai de nouveau inséré la table des matières dans la hiérarchie de LeavesView, mais cette fois-ci, j'ai "enterré" la vue de la table des matières en utilisant insertSubview: atIndex: pour le placer sous toutes les autres vues secondaires dans feuillesVoir. En masquant la vue à l'index 0, il sera facile de révéler la table des matières lorsque l'utilisateur appuiera sur le bouton, ce qui nous permettra également de créer facilement une animation avec vue à l'envers..

Étape 3: animer la transition de la table des matières

Avant de continuer avec l'ajout de fichiers plist pour stocker les informations de la table des matières, allons de l'avant et créons la transition qui sera déclenchée lorsque le bouton de contenu sera enfoncé. Cela facilitera la tâche de tester notre travail au fur et à mesure..

Dans WOTWViewController.m, ajoutez les lignes de code suivantes:

 - (void) displayTableOfContents // Cache le curseur de page self.pageSlider.hidden = YES; // Animer la transition avec un retournement horizontal de droite à gauche [UIView beginAnimations: nil context: nil]; [UIView setAnimationDuration: 0.5f]; [UIView setAnimationTransition: UIViewAnimationTransitionFlipFromRight forView: self-> leaves Cache de cache: OUI]; [self-> leavesView bringSubviewToFront: tableOfContentsView]; [UIView commitAnimations]; 

Sur la ligne 4, nous définissons la pageSlider à caché. Cela empêche l'utilisateur d'essayer de déplacer le curseur à un endroit différent du PDF pendant que la table des matières couvre l'affichage du livre..

Les lignes 6 à 11 traitent l’animation de retournement de page. La ligne 8 définit la durée de cette animation sur une demi-seconde et la ligne 9 spécifie le type d'animation (UIViewAnimationTransitionFlipFromRight) ainsi que l'opinion selon laquelle la transition devrait s'appliquer aux.

Bien sûr, aucun des codes ci-dessus ne nous sera utile s'il n'est pas exécuté. Ajouter une autre ligne à -viewDidLoad pour créer la vue TOC:

 [auto addTableOfContentsUIView];

Si vous générez et exécutez le projet maintenant, vous devriez avoir un bouton de contenu fonctionnel qui affiche une vue de table des matières simple..

Étape 4: Stockez les données de la table des matières dans des fichiers Plist

L'étape suivante consiste à ajouter les titres de chapitre à la vue de la table des matières. Cependant, comme nous allons créer la liste de chapitres de manière dynamique, nous devons d'abord stocker les informations de chapitre et de page. Un choix serait d’utiliser un NSDictionary et de créer les informations de chapitre / page de manière statique dans WOTWViewController fichier d'implémentation. Cela fonctionnerait certainement, mais lorsque je traite ce type d’informations, j’ai souvent plus de facilité à travailler avec des fichiers de liste de propriétés (plist). Nous allons créer deux fichiers plist pour ce projet: un pour stocker les informations de la colonne de gauche ("Livre 1") et un second pour stocker les informations de la deuxième colonne ("Livre 2")..

CTRL + Clic (ou clic droit) sur le groupe "Fichiers de support" dans le navigateur de projet Xcode. Sélectionnez "Ajouter des fichiers à WOTW". Dans la fenêtre qui apparaît, sélectionnez la catégorie "Ressources" puis "Liste des propriétés". Cliquez sur "Suivant" puis entrez le nom "BookOne" pour le fichier..

Ouvrez le nouvellement ajouté BookOne.plist fichier et ajoutez les paires clé / valeur affichées ci-dessous:

Utilisez la même méthode pour créer BookTwo.plist et changez les paires clé / valeur comme indiqué:

Étape 5: Ajouter la liste des chapitres de la table des matières

Maintenant que nous avons stocké les informations de chapitre / page pour le PDF, nous sommes prêts à créer par programme la liste de chapitres. Bien sûr, en plus de simplement énumérer le contenu, nous devons également permettre aux utilisateurs de cliquer sur l'un des chapitres pour accéder à cette partie du fichier PDF. Pour cette raison, chaque chapitre sera en réalité un UIButton.

L'endroit approprié pour ajouter la liste des chapitres est la première fois que vous créez la vue TOC. Allez à - (void) addTableOfContentsUIView et ajoutez les lignes de code suivantes:

 - (void) addTableOfContentsUIView if (! tableOfContentsView) // Créez la table des matières UIView. Contiendra tous les objets de la table des matières en tant que sujets. tableOfContentsView = [[UIView alloc] initWithFrame: CGRectMake (0.0f, 0.0, 563.0f, 845.0f)]; tableOfContentsView.backgroundColor = [UIColor whiteColor]; // Crée le titre du livre. Centrer sur le COT en haut. UILabel * bookHeading = [[UILabel alloc] initWithFrame: CGRectMake (170.0f, 30.0f, 300.0f, 40.0f)]; bookHeading.font = [UIFont font fontWithName: @ "Arial" taille: 24.0f]; bookHeading.text = @ "GUERRE DES MONDES"; bookHeading.textColor = [UIColor blackColor]; bookHeading.backgroundColor = [UIColor whiteColor]; [bookHeading sizeToFit]; [tableOfContentsView addSubview: bookHeading]; [bookHeading release]; // Ajouter le sous-en-tête "LIVRE I" comme en-tête de colonne de gauche UILabel * bookOneSubtitle = [[UILabel alloc] initWithFrame: CGRectMake (105.0f, 70.0f, 150.0f, 40.0f)]; bookOneSubtitle.font = [UIFont fontWithName: @ "Arial" size: 22.0f]; bookOneSubtitle.text = @ "LIVRE I"; bookOneSubtitle.textColor = [UIColor blackColor]; bookOneSubtitle.backgroundColor = [UIColor whiteColor]; [bookOneSubtitle sizeToFit]; [tableOfContentsView addSubview: bookOneSubtitle]; [publication de bookOneSubtitle]; // Ajouter le sous-en-tête "BOOK II" comme en-tête de colonne de droite UILabel * bookTwoSubtitle = [[UILabel alloc] initWithFrame: CGRectMake (375.0f, 70.0f, 150.0f, 40.0f)]; bookTwoSubtitle.font = [UIFont fontWithName: @ "Arial" taille: 22.0f]; bookTwoSubtitle.text = @ "LIVRE II"; bookTwoSubtitle.textColor = [UIColor blackColor]; bookTwoSubtitle.backgroundColor = [UIColor whiteColor]; [bookTwoSubtitle sizeToFit]; [tableOfContentsView addSubview: bookTwoSubtitle]; [publication de bookTwoSubtitle]; // Création d'objets NSDictionary à partir de fichiers de plist de colonne NSString * bookOneFilepath = [[NSBundle mainBundle] pathForResource: @ "BookOne" ofType: @ "plist"]; NSDictionary * bookOneTOC = [[NSDictionary alloc] initWithContentsOfFile: bookOneFilepath]; NSString * bookTwoFilepath = [[NSBundle mainBundle] pathForResource: @ "BookTwo" ofType: @ "plist"]; NSDictionary * bookTwoTOC = [[NSDictionary alloc] initWithContentsOfFile: bookTwoFilepath]; // Itère sur l'objet reach NSDictionary et ajoute des boutons UIB float colXOffset = 20.0f; float colYOffset = 100.0f; NSArray * triéKeys1 = [[bookOneTOC allKeys] triéArrayUsingComparator: ^ (id obj1, id obj2) if ([obj1 integerValue] < [obj2 integerValue] )  return (NSComparisonResult)NSOrderedAscending;  if ([obj1 integerValue] > [obj2 integerValue]) return (NSComparisonResult) NSOrderedDescending;  return (NSComparisonResult) NSOrderedSame; ]; for (clé NSString * dans sortKeys1) int pageIndex = [clé intValeur]; NSString * sectionTitle = [bookOneTOC objectForKey: key]; UIButton * sectionButton = [[UIButton alloc] initWithFrame: CGRectMake (colXOffset, colYOffset, 250.0f, 35.0f)]; [sectionButton setTitle: sectionTitle forState: UIControlStateNormal]; sectionButton.tag = pageIndex; [sectionButton addTarget: action propre: @selector (contentsButtonPressed :) pour les événements de contrôle: UIControlEventTouchUpInside]; sectionButton.enabled = NO; [sectionButton setBackgroundColor: [UIColor lightGrayColor]]; [sectionButton setTitleColor: [UIColor whiteColor] pourState: UIControlStateNormal]; [tableOfContentsView addSubview: sectionButton]; [sectionButton release]; colYOffset + = 40.0f;  [version de bookOneTOC]; colXOffset = 293.0f; colYOffset = 100.0f; NSArray * triéKeys2 = [[bookTwoTOC allKeys] triéArrayUsingComparator: ^ (id obj1, id obj2) if ([obj1 integerValue] < [obj2 integerValue] )  return (NSComparisonResult)NSOrderedAscending;  if ([obj1 integerValue] > [obj2 integerValue]) return (NSComparisonResult) NSOrderedDescending;  return (NSComparisonResult) NSOrderedSame; ]; for (clé NSString * dans sortKeys2) int pageIndex = [clé intValeur]; NSString * sectionTitle = [bookTwoTOC objectForKey: key]; UIButton * sectionButton = [[UIButton alloc] initWithFrame: CGRectMake (colXOffset, colYOffset, 250.0f, 35.0f)]; [sectionButton setTitle: sectionTitle forState: UIControlStateNormal]; [sectionButton setTitleColor: [UIColor whiteColor] pourState: UIControlStateNormal]; sectionButton.tag = pageIndex; sectionButton.enabled = NO; [sectionButton addTarget: action propre: @selector (contentsButtonPressed :) pour les événements de contrôle: UIControlEventTouchUpInside]; [sectionButton setBackgroundColor: [UIColor lightGrayColor]]; [tableOfContentsView addSubview: sectionButton]; [sectionButton release]; colYOffset + = 40.0f;  [version de bookTwoTOC]; // Ajoute la table des matières directement à la vue Feuilles, mais la cache au "calque" 0 [self-> leavesView insertSubview: tableOfContentsView atIndex: 0]; 

La plupart de ce code devrait être relativement explicite pour un développeur intermédiaire. Cependant, plusieurs éléments méritent d’être approfondis..

La syntaxe utilisée dans le triéTableauUtilisationComparateur: Cette section aura l’air étrange si vous n’avez pas programmé avec les "Blocs" Objective-C auparavant. Une discussion complète sur les blocs va au-delà de la portée de ce didacticiel, mais il est important de savoir que pour cette application, le code de bloc est simplement responsable du tri du tableau de clés de plist par numéro de page, par ordre croissant. Cela garantit que les chapitres seront affichés dans le bon ordre. Si vous souhaitez en savoir plus sur les blocs, consultez la documentation officielle..

Une autre considération importante est que je désactive chacun des UIButton objets créés avant de les ajouter à la vue de la table des matières. C’est pour empêcher les coups sur le feuillesVoir de passer et de déclencher les boutons lorsque la table des matières n’est pas affichée. Nous devrons les réactiver dans le -displayTableOfContents méthode. Allons-y et faisons cela maintenant.

Modifier le -displayTableOfContents méthode à lire comme suit:

 - (void) displayTableOfContents // Cache le curseur de page self.pageSlider.hidden = YES; // Parcourir les sous-vues à la recherche de boutons pour (sous-vue UIView * dans tableOfContentsView.subviews) if ([sous-vue isKindOfClass: [Classe UIButton]]]) bouton UIButton * = (UIButton *) subview; button.enabled = YES;  // Animer la transition avec un retournement horizontal de droite à gauche [UIView beginAnimations: nil context: nil]; [UIView setAnimationDuration: 0.5f]; [UIView setAnimationTransition: UIViewAnimationTransitionFlipFromRight forView: self-> leaves Cache de cache: OUI]; [self-> leavesView bringSubviewToFront: tableOfContentsView]; [UIView commitAnimations]; 

Les lignes de code mises en évidence ci-dessus traverseront les sous-vues dans tableOfContentsView à la recherche de ceux qui correspondent à la UIButton classe. Quand il en trouve un, il passe de désactivé à activé.

Étape 6: Répondre à la sélection du chapitre

Si vous avez soigneusement examiné le code à l’étape 5, vous avez probablement remarqué que tous les UIButton les objets ajoutés ont reçu le sélecteur contentsButtonPressed: pour l'événement de retouche à l'intérieur. Cette étape va créer cette méthode.

Dans WOTWViewController.m, ajoutez les lignes de code suivantes:

 - (void) contentsButtonPressed: (UIButton *) sender // Met à jour la position d'affichage du PDF self-> leavesView.currentPageIndex = sender.tag; // Affiche le fichier UISlider self.pageSlider.hidden = NO; self.pageSlider.value = (float) sender.tag; // Animez le fichier PDF jusqu'au sommet des feuillesView Subviews [UIView beginAnimations: nil context: nil]; [UIView setAnimationDuration: 0.5f]; [UIView setAnimationTransition: UIViewAnimationTransitionFlipFromLeft forView: self-> leavesView cache: YES]; [self-> leavesView sendSubviewToBack: tableOfContentsView]; [UIView commitAnimations]; // Désactive les boutons UIB ajoutés à la table des matières lorsqu'il n'est pas affiché pour la sous-vue (UIView * dans tableOfContentsView.subviews) if ([sous-vue isKindOfClass: [classe UIButton]]) UIButton * button = (UIButton *); button.enabled = NO; 

À ce stade de notre série, rien dans le code ci-dessus ne devrait être nouveau pour vous, je ne vais donc pas parler de ce qui se passe en détail. Les étapes générales sont résumées dans les commentaires du code.

Emballer

Si vous avez suivi les étapes ci-dessus, vous devriez maintenant avoir une table des matières fonctionnelle pour le La guerre des mondes lecteur! L'utilisateur commencera à voir le bouton de contenu lorsqu'il se déplacera sur une page autre que la couverture. Si vous appuyez sur le bouton de contenu, l'affichage du livre est retourné verticalement pour afficher l'écran de la table des matières. Si vous sélectionnez l'un des chapitres de la liste, vous passerez directement à ce chapitre et retournerez l'affichage au livre..

Devrais-je continuer cette série?

Au cours des deux derniers tutoriels de cette série, j'ai terminé par un sondage qui me demandait si je devais continuer la série et, le cas échéant, ce que je devrais écrire à propos de la suite. Cette fois, s'il vous plaît "voter" en laissant un commentaire ci-dessous. Si vous souhaitez que je continue à écrire sur le lecteur PDF avec des feuilles, laissez-moi savoir quelle fonctionnalité ou quel raffinement devrait, selon vous, être le sujet du prochain tutoriel. Quelques bonnes options incluent: adapter l'affichage à différentes orientations du périphérique, ajouter des signets ou conserver l'état de la page.

D'autre part, si vous préférez que nous couvrions entièrement un sujet différent du SDK iOS, laissez-moi un commentaire pour me dire quel aspect du développement du SDK iOS ou des projets open source associés sur lesquels vous aimeriez m'écrire..

Pour que la série iPad Reader continue, au moins 10 lecteurs devront se prononcer en faveur de la poursuite de la série avant le 23 septembre 2011..

MISE À JOUR 17/09/2011: Nous avons eu d'excellents commentaires dans la section des commentaires, et il semble que tous les postés soient intéressés par au moins un autre tutoriel. Des votes ont été reçus pour les fonctions suivantes: prise en charge de l'orientation des appareils (7 votes), prise en charge des signets (2 votes), affichage de deux pages en mode paysage (2 votes), maintien de l'état de la page (1 vote), annotation (1 vote), à ​​gauche vers la droite, flip (1 vote) et des liens PDF dynamiques (1 vote). L’orientation par appareil a été le grand gagnant, alors je ferai au moins un article de plus dans cette série au cours des deux prochaines semaines pour vous montrer comment faire.!

Merci d'avoir lu!