iOS SDK Adăugarea unui cuprins la un cititor iPad

Aceasta este a treia tranșă dintr-o serie privind crearea unui cititor de documente iPad PDF pentru carte Războiul lumilor. În tutorialul de astăzi, voi demonstra cum să adăugați un cuprins în proiect. Procedând astfel, voi acoperi lucrul cu fișierele plist, subview-urile de layering, animațiile de bază UIView și crearea manuală a componentelor de interfață.

Unde am plecat

În tutorialul din săptămâna trecută, am demonstrat cum să adăugați a UISlider la proiectul care ar permite utilizatorului să se "curățe" rapid înainte sau înapoi în Razboiul lumilor PDF. Aceasta este o caracteristică esențială pentru orice cititor de fișiere PDF, însă rămâne o sarcină foarte mare pentru utilizator dacă dorește să navigheze către un anumit capitol sau secțiune. În consecință, adăugarea unui Cuprins (denumit în continuare simplu "TOC") părea a fi următorul pas logic și, într-un sondaj atașat ultimului tutorial, 68% dintre cititorii noștri au votat în favoarea acestui lucru. În pașii acoperiți astăzi, vă voi arăta cum să faceți asta.

Este important să rețineți că Razboiul lumilor textul folosit de acest tutorial nu aveți deja o pagină TOC în documentul PDF. În consecință, ne vom concentra pe crearea propriului TOC UIView.

O notă finală înainte de a începe: până acum acest tutorial sa bazat în primul rând pe interfața Builder pentru configurarea și crearea UI. În această lecție, voi fi mutat departe de Interface Builder și creând câteva noi componente ale interfeței UIKit programat în cadrul controlerului nostru principal de vizualizare. Câteodată prefer să gestionez crearea UI în acest fel, așa că am crezut că o voi arăta ca o abordare alternativă în scopuri educaționale. Realizați doar faptul că toate componentele UIKit pe care le-am creat în cod ar fi putut fi făcute în Interface Builder și neambalate de la un NIB.

Pasul 1: Creați butonul TOC

Cele mai bune aplicații de citire pentru iPad oferă utilizatorilor un buton consistent care va trece direct la cuprinsul cărții. Vom face același lucru aici adăugând o UIButton în colțul din dreapta sus al afișării cărții. Am putea face cu ușurință acest buton o pictogramă sau o picteze cu un gradient simplu, dar în schimb vom păstra lucrurile simple. Butonul va avea un fundal transparent, un text albastru și textul "Conținut" ca titlu.

Pentru a începe, deschideți-vă WOTWViewController.h și adăugați următorul membru de date:

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

În timp ce vă aflați în fișierul de interfață, continuați și declanșați o metodă care să fie responsabilă pentru crearea manuală a butonului:

  @property (nonatomic, reține) IBOutlet UISlider * pageSlider; - (void) loadPDF; - (void) addContentsUIButton;

Apoi treceți la WOTWViewController.m fișier și codul addContentsUIButton metodă:

 - (void) addContentsUIButton if (! contentsButton) // Inițializare de bazăButton = [[UIButton alloc] initWithFrame: CGRectMake (460.0f, 5.0f, 100.0f, 45.0f)]; [contentsButton setTitle: @ "Contents" pentruState: UIControlStateNormal]; [contentsButton setTitleColor: [UICcolor blueColor] pentruState: UIControlStateNormal]; [contentsButton setTitleColor: [UICcolor redColor] pentruState: UIControlStateHighlighted]; contentsButton.backgroundColor = [UICcolor clearColor]; // Când butonul este apăsat, declanșați metoda "displayTableOfContents" [contentsButton addTarget: auto action: @selector (displayTableOfContents) forControlEvents: UIControlEventTouchUpInside]; // Ascundeți butonul în mod prestabilit, deoarece nu ar trebui să apară pe conținutul cărții contentsButton.hidden = YES; // Adăugați butonul ca subview al lui LeavesView [self-> leavesView addSubview: contentsButton]; 

Deoarece un singur buton de conținut ar trebui să existe la un moment dat, vom începe această metodă pe linia 3, verificând pentru a ne asigura că nu am creat și adăugat deja acest buton în vizualizarea Frunze. Dacă avem, apelul metodei nu va executa pur și simplu niciunul din codul de creare a butoanelor.

Liniile 5 - 10 sunt câteva instrucțiuni de creare a butoanelor standard. Merită remarcat faptul că linia 6 cheamă -initWithFrame: metoda, care este inițializatorul desemnat pentru UIButton, și configurează butonul să aibă o valoare a axei x de 460, o valoare a axei y de 5, o lățime de 100 și o înălțime de 45. De asemenea, merită remarcat faptul că ambele titlu si titleColor proprietăți ale UIButton sunt dependente de stat. Acest lucru vă permite să răspundeți vizual la evenimente cum ar fi butonul fiind apăsat sau dezactivat.

Dacă ați creat doar butoane cu Interface Builder înainte, lucrurile devin puțin mai interesante pe linia 12. Această linie demonstrează cum să setați manual ce selector ar trebui să fie apelat pentru unul dintre diferitele evenimente de control al butonului. Dacă vă întrebați cum a realizat acest lucru Interface Builder, ar trebui să fie ceva mai clar acum.

Apoi, proprietatea ascunsă a butonului este setată la "YES". Acest lucru se datorează faptului că cititorul se încarcă inițial cu capacul de carte afișat și nu pare potrivit să se afișeze legătura la TOC până cel puțin la următoarea pagină.

Pe linia 19, adăugăm noul nostru creat UIButton direct la LeavesView obiect ca un subiectiv. Se pare logic ca acest buton să facă parte din LeavesView, iar acest lucru ne va împiedica să ne amintim să comutați între butoanele LeavesView și conținutul când este afișat mesajul TOC. De asemenea, este posibil să integrați butonul de conținut cu animația TOC luând această abordare (mai multe despre aceasta mai târziu).

Desigur, nu suntem încă terminați. Mai trebuie să numim această metodă de undeva în cadrul ciclului de viață al programului și trebuie să eliberăm și butonul pe care l-am alocat.

Salt la -viewDidLoad pentru a adăuga butonul cu această linie de cod:

- (void) viewDidLoad

 [self addContentsUIButton];

Acest lucru pare a fi un loc bun pentru a adăuga butonul TOC, dar vă întrebați de ce mă deranjez folosind un apel de metodă în loc să scriu codul inițial în această metodă? Când am construit prima oară această caracteristică, am făcut-o. Cu toate acestea, prin adăugarea inițială a întregului cod direct în cadrul acestuia viewDidLoad, lucrurile au devenit foarte dezordonate și a fost mai greu să obții o idee generală despre ceea ce se întâmpla în timpul ciclului de viață al aplicației. Împărțirea fragmentelor mai mari de coduri în metode independente a rezolvat problema respectivă și a făcut proiectul mai ușor de înțeles și mai ușor de întreținut.

Deoarece am alocat butonul de conținut de la viewDidLoad, ar trebui să o eliberăm și în ambele -viewDidUnload și -dealloc.

- (void) viewDidUnload

 [conținutul butonului de eliberare], contentsButton = nil;

- (void) dealloc

 [conținut];

Rețineți din cele de mai sus că am setat contentsButton pentru a fi ascuns inițial. Trebuie să adăugăm câteva linii de cod la LeavesView metoda delegată -leavesView: didTurnToPageAtIndex: pentru a afișa butonul de conținut după ce utilizatorul nu mai este pe pagina de copertă. A face acest lucru este destul de simplu:

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

Dacă construiți și executați proiectul în acest moment, ar trebui să vedeți butonul de conținut conținut în colțul din dreapta sus al vizualizării cărților. Cu toate acestea, dacă atingeți de fapt butonul, aplicația se va prăbuși deoarece nu am implementat încă displayTableOfContents selectorul acțiunii butonului va încerca să sune.

Pasul 2: Creați vizualizarea TOC

Cu butonul de conținut în loc, este timpul să vă concentrați asupra realizării vizualizării tabelului cu conținut. Vom lua aceeași abordare folosită mai sus, deci reveniți la WOTWViewController.h fișier și adăugați următorul membru de date:

 UIView * tableOfContentsView;

Apoi, declarați o metodă pentru a gestiona adăugarea TOC la LeavesView:

 - (void) addTableOfContentsUIView;

Acum du-te la WOTWViewController.m și adăugați codul necesar pentru a crea TOC UIView:

 - (void) addTableOfContentsUIView if (! tableOfContentsView) // Creați vizualizarea TOC. Va menține toate obiectele TOC sub formă de subview. tableOfContentsView = [[UIView alocare] initWithFrame: CGRectMake (0.0f, 0.0, 563.0f, 845.0f)]; tableOfContentsView.backgroundColor = [UICcolor whiteColor]; // Creați titlul cărții. Centrul pe TOC în partea de sus. UILabel * bookHeading = [[UILabel alocare] initWithFrame: CGRectMake (170.0f, 30.0f, 300.0f, 40.0f)]; bookHeading.font = [UIFont fontWithName: @ "Arial" dimensiune: 24.0f]; bookHeading.text = @ "RĂZBOIUL LUMII"; bookHeading.textColor = [UICcolor blackColor]; bookHeading.backgroundColor = [UICcolorcolor alb]; [bookHeading sizeToFit]; [tableOfContentsView addSubview: bookHeading]; [book release de presă]; // Adăugați subcapitolul "BOOK I" ca antet de coloană din stânga UILabel * bookOneSubtitle = [[UILabel alin] initWithFrame: CGRectMake (105.0f, 70.0f, 150.0f, 40.0f)]; bookOneSubtitle.font = [UIFont fontWithName: @ "Arial" dimensiune: 22.0f]; bookOneSubtitle.text = @ "CARTEA I"; bookOneSubtitle.textColor = [UICcolor blackColor]; bookOneSubtitle.backgroundColor = [UICcolor whiteColor]; [bookOneSubtitle sizeToFit]; [tableOfContentsView addSubview: bookOneSubtitle]; [bookOneSubtitle release]; // Adăugați subcapitolul "BOOK II" ca antet al coloanei din dreapta UILabel * bookTwoSubtitle = [[UILabel alin] initWithFrame: CGRectMake (375.0f, 70.0f, 150.0f, 40.0f)]; bookTwoSubtitle.font = [UIFont fontWithName: @ "Arial" size: 22.0f]; bookTwoSubtitle.text = @ "CARTEA II"; bookTwoSubtitle.textColor = [UICcolor blackColor]; bookTwoSubtitle.backgroundColor = [UICcolor whiteColor]; [bookTwoSubtitle sizeToFit]; [tableOfContentsView addSubview: bookTwoSubtitle]; [bookTwoSubtitle release]; // Adăugați TOC direct la vizualizarea Frunze, dar ascundeți-l la "strat" ​​0 [auto-> leftView insertSubview: tableOfContentsView atIndex: 0]; 

Metoda de mai sus creează un șablon de bază pentru vizualizarea TOC. Dimensiunile vizualizării sunt aceleași cu afișarea cărții / PDF și am adăugat trei etichete: un titlu de carte, un antet pentru "Cartea 1" și un antet pentru "Cartea 2". Acest lucru poate părea un pic ciudat: nu este Razboiul lumilor o carte? Este publicat astăzi ca un volum, dar inițial a fost tipărit ca o serie de reviste și a luat forma "Carte 1" și "Cartea 2". Deoarece acesta este formatul pe care îl folosește PDF-ul, este ceea ce am integrat și în documentul de informare.

Dacă înțelegeți modul în care am gestionat crearea butonului de conținut din pasul anterior, atunci majoritatea codului de mai sus ar trebui să aibă sens și pentru dvs. Singura notă suplimentară care merită făcută este aceea că am inserat din nou TOC în ierarhia LeavesView, dar de această dată am "îngropat" vizualizarea TOC utilizând insertSubview: atIndex: să o plasați sub toate celelalte subiecte din leavesView. Prin ascunderea vederii la indexul 0, va fi ușor să dezvălui TOC atunci când utilizatorul apasă butonul și ne va permite, de asemenea, să creăm cu ușurință o animație cu vedere flip.

Pasul 3: Animați tranziția TOC

Înainte de a continua cu adăugarea de fișiere plist pentru stocarea informațiilor despre cuprins, hai să mergem mai departe și să creăm tranziția care va fi declanșată atunci când este apăsat butonul pentru conținut. Acest lucru va facilita testarea muncii noastre pe măsură ce mergem.

În WOTWViewController.m, adăugați următoarele rânduri de cod:

 - (void) displayTableOfContents // Ascundeți cursorul paginii self.pageSlider.hidden = YES; // Animați tranziția cu un flip orizontal de la dreapta la stânga [UIView beginAnimations: context zero: zero]; [Durata de desfășurare a activității: 0.5f]; [UIView setAnimationTransition: UIViewAnimationTransitionFlipFromRight forView: auto-> leftView cache: YES]; [auto-> leaveView bringSubviewToFront: tableOfContentsView]; [Afișează comenziAnimații]; 

Pe linia 4, am setat pageSlider la ascuns. Acest lucru împiedică utilizatorul să încerce să frece într-un loc diferit în PDF în timp ce TOC acoperă afișajul cărții.

Liniile 6 - 11 se ocupă de animația flip page. Linia 8 stabilește durata acestei animații la o jumătate de secundă, iar linia 9 specifică tipul de animație (UIViewAnimationTransitionFlipFromRight), precum și opinia că tranziția ar trebui aplicată.

Desigur, nici unul din codul de mai sus nu ne va face nici un bine dacă nu este executat. Adăugați o altă linie la -viewDidLoad pentru a crea vizualizarea TOC:

 [self addTableOfContentsUIView];

Dacă construiți și executați proiectul acum, trebuie să aveți un buton de conținut funcțional care afișează o vizualizare TOC simplă.

Pasul 4: Stocați datele TOC în fișiere Plist

Următorul pas este să adăugați titlurile capitolelor în vizualizarea TOC. Totuși, pentru că vom crea dinamic lista de capitole, trebuie să stocăm mai întâi capitolul și informațiile despre pagină. O alegere ar fi să utilizați un NSDictionary și să creați static informațiile despre capitol / pagină în WOTWViewController fișier de implementare. Acest lucru ar funcționa cu siguranță, dar atunci când se ocupă de acest tip de informații, deseori găsesc mai ușor să lucrezi cu fișiere cu listă de proprietăți (plist). Vom crea două fișiere plist pentru acest proiect: unul pentru a stoca informațiile pentru coloana din stânga ("Cartea 1") și o secundă pentru a stoca informațiile pentru a doua coloană ("Cartea 2").

CTRL + Faceți clic pe (sau faceți clic cu butonul din dreapta) în grupul "Fișiere suport" din Xcode Project Navigator. Selectați "Adăugați fișiere în WOTW". În fereastra care apare, selectați categoria "Resurse" și apoi alegeți "Lista de proprietăți". Dați clic pe "Următorul" și apoi introduceți numele "BookOne" pentru fișier.

Deschideți nou adăugat BookOne.plist fișier și adăugați perechile cheie / valoare afișate mai jos:

Utilizați aceeași metodă pentru a crea BookTwo.plist și modificați perechile cheie / valoare după cum se arată:

Pasul 5: Adăugați lista de capitole TOC

Acum că am stocat informațiile despre capitol / pagină pentru PDF, suntem gata să creați în mod programatic lista de capitole. Desigur, pe lângă listarea conținutului, trebuie de asemenea să permitem utilizatorilor să atingă pe oricare dintre capitole pentru a trece la porțiunea din PDF. Din acest motiv, fiecare capitol va fi de fapt a UIButton.

Locația potrivită pentru adăugarea listei de capitole este atunci când creați pentru prima dată vizualizarea TOC, deci mergeți la - (void) addTableOfContentsUIView și adăugați următoarele linii de cod:

 - (void) addTableOfContentsUIView if (! tableOfContentsView) // Creați vizualizarea TOC. Va păstra toate obiectele TOC ca subvii. tableOfContentsView = [[UIView alocare] initWithFrame: CGRectMake (0.0f, 0.0, 563.0f, 845.0f)]; tableOfContentsView.backgroundColor = [UICcolor whiteColor]; // Creați titlul cărții. Centrul pe TOC în partea de sus. UILabel * bookHeading = [[UILabel alocare] initWithFrame: CGRectMake (170.0f, 30.0f, 300.0f, 40.0f)]; bookHeading.font = [UIFont fontWithName: @ "Arial" dimensiune: 24.0f]; bookHeading.text = @ "RĂZBOIUL LUMII"; bookHeading.textColor = [UICcolor blackColor]; bookHeading.backgroundColor = [UICcolorcolor alb]; [bookHeading sizeToFit]; [tableOfContentsView addSubview: bookHeading]; [book release de presă]; // Adăugați subcapitolul "BOOK I" ca antet de coloană din stânga UILabel * bookOneSubtitle = [[UILabel alin] initWithFrame: CGRectMake (105.0f, 70.0f, 150.0f, 40.0f)]; bookOneSubtitle.font = [UIFont fontWithName: @ "Arial" dimensiune: 22.0f]; bookOneSubtitle.text = @ "CARTEA I"; bookOneSubtitle.textColor = [UICcolor blackColor]; bookOneSubtitle.backgroundColor = [UICcolor whiteColor]; [bookOneSubtitle sizeToFit]; [tableOfContentsView addSubview: bookOneSubtitle]; [bookOneSubtitle release]; // Adăugați subcapitolul "BOOK II" ca antet al coloanei din dreapta UILabel * bookTwoSubtitle = [[UILabel alin] initWithFrame: CGRectMake (375.0f, 70.0f, 150.0f, 40.0f)]; bookTwoSubtitle.font = [UIFont fontWithName: @ "Arial" size: 22.0f]; bookTwoSubtitle.text = @ "CARTEA II"; bookTwoSubtitle.textColor = [UICcolor blackColor]; bookTwoSubtitle.backgroundColor = [UICcolor whiteColor]; [bookTwoSubtitle sizeToFit]; [tableOfContentsView addSubview: bookTwoSubtitle]; [bookTwoSubtitle release]; // Creați obiecte NSDictionary din fișiere plist coloane NSString * bookOneFilepath = [[NSBundle mainBundle] pathForResource: @ "BookOne" dinType: @ "plist"]; NSDictionary * bookOneTOC = [[NSDictionary alin] initWithContentsOfFile: bookOneFilepath]; NSString * bookTwoFilepath = [[NSBundle mainBundle] caleForResurse: @ "BookTwo" dinType: @ "plist"]; NSDictionary * bookTwoTOC = [[NSDictionary alocare] initWithContentsOfFile: bookTwoFilepath]; // Iterați peste obiectul NSDictionary și adăugați UIButtons float colXOffset = 20.0f; float colYOffset = 100.0f; NSArray * sortKeys1 = [[bookOneTOC allKeys] sortArrayUsingComparator: ^ (id obj1, id obj2) dacă [[obj1 integerValue] < [obj2 integerValue] )  return (NSComparisonResult)NSOrderedAscending;  if ([obj1 integerValue] > [obj2 integerValue]) întoarcere (NSComparisonResult) NSOrderedDescending;  return (NSComparisonResult) NSOrderedSame; ]; pentru (tasta NSString * în sortKeys1) int pageIndex = [key intValue]; NSString * sectionTitle = [bookOneTOC objectForKey: cheie]; UIButton * sectionButton = [[UIButton alin] initWithFrame: CGRectMake (colXOffset, colYOffset, 250.0f, 35.0f)]; [sectionButton setTitle: sectionTitle forState: UIControlStateNormal]; sectionButton.tag = pageIndex; [sectionButton addTarget: acțiune auto: @selector (contentsButtonPressed :) forControlEvents: UIControlEventTouchUpInside]; sectionButton.enabled = NU; [sectionButton setBackgroundColor: [UICcolor lightGrayColor]]; [sectionButton setTitleColor: [UICcolor whiteColor] pentruState: UIControlStateNormal]; [tableOfContentsView addSubview: sectionButton]; [section releaseButton]; colYOffset + = 40.0f;  [eliberarea bookOneTOC]; colXOffset = 293.0f; colYOffset = 100.0f; NSArray * sortKeys2 = [[bookTwoTOC allKeys] sortedArrayUsingComparator: ^ (id obj1, id obj2) dacă [[obj1 integerValue] < [obj2 integerValue] )  return (NSComparisonResult)NSOrderedAscending;  if ([obj1 integerValue] > [obj2 integerValue]) întoarcere (NSComparisonResult) NSOrderedDescending;  return (NSComparisonResult) NSOrderedSame; ]; pentru (cheia NSString * în sortKeys2) int pageIndex = [key intValue]; NSString * sectionTitle = [bookTwoTOC objectForKey: cheie]; UIButton * sectionButton = [[UIButton alin] initWithFrame: CGRectMake (colXOffset, colYOffset, 250.0f, 35.0f)]; [sectionButton setTitle: sectionTitle forState: UIControlStateNormal]; [sectionButton setTitleColor: [UICcolor whiteColor] pentruState: UIControlStateNormal]; sectionButton.tag = pageIndex; sectionButton.enabled = NU; [sectionButton addTarget: acțiune auto: @selector (contentsButtonPressed :) forControlEvents: UIControlEventTouchUpInside]; [sectionButton setBackgroundColor: [UICcolor lightGrayColor]]; [tableOfContentsView addSubview: sectionButton]; [section releaseButton]; colYOffset + = 40.0f;  [eliberare bookTwoTOC]; // Adăugați TOC direct la vizualizarea Frunze, dar ascundeți-l la "strat" ​​0 [auto-> leftView insertSubview: tableOfContentsView atIndex: 0]; 

Cea mai mare parte a acestui cod ar trebui să fie relativ explicită pentru un dezvoltator intermediar. Cu toate acestea, există câteva piese care merită discutate în continuare.

Sintaxa utilizată în sortedArrayUsingComparator: secțiune va arăta ciudat dacă nu ați programat cu Obiectiv-C "Blocuri" înainte. O discuție completă a Blocurilor este dincolo de scopul acestui tutorial, dar lucrul important de știut pentru această aplicație este că codul bloc este pur și simplu responsabil pentru sortarea matricei de taste plist cu numărul paginii în ordine ascendentă. Acest lucru asigură că capitolele vor fi afișate în ordinea corectă. Dacă doriți să aflați mai multe despre blocuri, consultați documentația oficială.

Un alt aspect important este acela că dezactivez fiecare UIButton obiecte create înainte de a le adăuga în vizualizarea TOC. Acest lucru este de a preveni robinete pe leavesView de la trecerea și declanșarea butoanelor atunci când TOC nu este afișat. Va trebui să le activați din nou în -displayTableOfContents metodă. Să mergem mai departe și să facem asta acum.

Modificați -displayTableOfContents metoda de a citi așa:

 - (void) displayTableOfContents // Ascundeți cursorul paginii self.pageSlider.hidden = YES; // Traverse subviews în căutarea butoanelor pentru (UIView * subview în tableOfContentsView.subviews) if ([subview este KindOfClass: [UIButton class]]) UIButton * button = (UIButton *) subview; button.enabled = DA;  / / Animați tranziția cu un flip orizontal de la dreapta la stânga [UIView beginAnimations: context zero: zero]; [Durata de desfășurare a activității: 0.5f]; [UIView setAnimationTransition: UIViewAnimationTransitionFlipFromRight forView: auto-> leftView cache: YES]; [auto-> leaveView bringSubviewToFront: tableOfContentsView]; [Afișează comenziAnimații]; 

Liniile de cod evidențiate mai sus vor traversa subrevisele din tableOfContentsView în căutarea celor care se potrivesc UIButton clasă. Când găsește una, o comută de la dezactivat la activat.

Pasul 6: Răspundeți la alegerea capitolului

Dacă ați revizuit cu atenție codul la pasul 5, probabil ați observat că toate UIButton obiectele adăugate au fost date selectorului contentsButtonPressed: pentru atingerea în interiorul evenimentului. Acest pas va crea această metodă.

În WOTWViewController.m, adăugați următoarele rânduri de cod:

 - (void) contentButtonPressed: (UIButton *) expeditor // Actualizați poziția de afișare PDF auto-> leavesView.currentPageIndex = sender.tag; // Afișați auto.pageSlider.hidden pentru UISlider = NO; auto.pageSlider.value = (float) sender.tag; // Animați PDF-ul în partea de sus a subview-urilor din vizualizarea frunze [UIView beginAnimations: context zero: zero]; [Durata de desfășurare a activității: 0.5f]; [UIView setAnimationTransition: UIViewAnimationTransitionFlipFromLeft forView: auto-> leftView cache: YES]; [self-> leaveView trimiteSubviewToBack: tableOfContentsView]; [Afișează comenziAnimații]; // Dezactivați UIButtonii adăugați la TOC atunci când nu sunt vizualizați pentru (subdiviziune UIView * în tableOfContentsView.subviews) if (subdiviziuneKindOfClass: [UIButton class]]) UIButton * button = (UIButton *) subview; button.enabled = NO; 

În acest moment în seria noastră, nimic din codul de mai sus nu ar trebui să fie nou pentru tine, deci nu voi discuta ce se întâmplă în detaliu. Pașii generali sunt rezumați în comentariile codului.

Învelire

Dacă ați urmat pașii de mai sus, ar trebui să aveți acum un tabel de conținut funcțional pentru Razboiul lumilor cititor! Utilizatorul va începe să vizualizeze butonul de conținut atunci când se mută în altă pagină decât în ​​copertă, iar atingerea butonului de conținut va afișa ecranul cărții pe verticală pentru a afișa ecranul TOC. Selectarea oricăreia dintre capitolele enumerate va trece direct la acel capitol și va întoarce afișajul înapoi la carte.

Ar trebui să continui această serie?

Pentru ultimele două tutoriale din această serie, am încheiat un sondaj care ne-a întrebat dacă ar trebui să continui seria și, dacă da, ce ar trebui să scriu despre următorul. De data aceasta, vă rugăm să "votați" lăsând un comentariu de mai jos. Dacă doriți să continuu să scriu despre cititorul PDF cu frunze, anunțați-ne ce caracteristică sau rafinament credeți că ar trebui să fie subiectul următorului tutorial. Câteva opțiuni bune includ: adaptarea afișajului pentru orientări diferite ale dispozitivului, adăugarea de marcaje sau menținerea stării paginii.

Pe de altă parte, dacă preferați să acoperim în totalitate un alt subiect SDK pentru iOS, lăsați un comentariu care să-mi spună ce aspect al dezvoltării SDK-ului iOS sau al proiectelor open source asociate pe care ați dori să le vedeți scrie despre.

Pentru ca seria iPad Reader să continue, cel puțin 10 cititori vor trebui să comenteze în favoarea continuării seriei până pe 23 septembrie 2011.

UPDATE 9/17/2011: Am avut niște răspunsuri minunate în secțiunea de comentarii și se pare că toți cei care au postat sunt interesați de cel puțin un tutorial. Voturile pentru următoarele caracteristici au fost primite: suport pentru orientarea dispozitivului (7 voturi), suport pentru marcaj (2 voturi), afișare pe două pagini în peisaj (2 voturi), menținerea stării paginii (1 vot), adnotare (1 vot) (1 vot) și link-uri dinamice PDF (1 vot). Orientarea dispozitivului a fost clar câștigătoare, așa că voi face cel puțin încă un post din această serie în următoarele două săptămâni pentru a vă arăta cum se poate face!

Vă mulțumim pentru lectură!

Cod