5. Funzionalità MobilePaper
• Visualizzazione in portrait e landscape (2 pagine affiancate)
• Zoom della pagina tramite pinch o con doppio tap
• Possibilità di passare alle pagine successive o precedenti
• Visualizzazione delle pagine tramite elenco e/o miniature
• Visualizzazione dell'indice (capitoli e paragrafi del pdf)
• Memorizzazione dei segnalibri (preferiti)
• Scelta della musica di sottofondo
• Inserimento di note
• Ricerca di testo all'interno della rivista
• Disponibile su iOS ed Android
5
6. Editoria su iOS
• Varie possibilità:
– App Native
– Uso di PDF con eventuale aggiunta di
elementi nativi (multimedia ed interazione)
– HTML 5
6
7. Il formato Pdf
• Portable Document Format
• File basato su un linguaggio di descrizione pagina
• Sviluppato da Adobe System nel 1993
• Nel 2007 è diventato standard ISO 32000
• Ci sono vari sottoformati (PDF/A, PDF/X, PDF/E...)
7
8. PDF/A
• PDF/A (PDF/Archiving) per l’archiviazione a lungo
termine (ha 2 sottoformati /A-1a /A-1b)
• Standard ISO 19005-1:2005 dal 2005
• Basato sulla vesione 1.4 del formato PDF di Adobe
• Documenti “auto contenuti”
– Include i font che utilizza!!
– Include immagini, colori, altri dati
– Non ci sono fonti esterne
• Nel sottoformato PDF/A-2 si basa PDF v. 1.7
8
9. PDF: specifiche
http://www.adobe.com/devnet/pdf/
pdf_reference.html
Ultima versione:
PDF Reference, sixth edition APDF version 1.7
1310 pagine!!!
9
10. Uso della webview
• Vantaggi
– Facile da realizzare
– Possibilità di usare pdf “online”
– Funzionamento dei link interni
• Svantaggi
– Poca interazione lato utente
– Scrollview verticale
– Nessuna paginazione
10
11. Caricare Pdf in una webview
NSString *pdfPath = [[NSBundle mainBundle] pathForResource:@"file"
ofType:@"pdf"];
NSURL *url = [NSURL fileURLWithPath:pdfPath];
NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url];
[webView loadRequest:urlRequest];
11
13. Uso di Quartz
• Motore di rendering di Darwin
chiamato “per gli amici” con il
nome di Core Graphics
• Quartz 2D:
– libreria grafica ereditata da QuickDraw
– usa il formato PDF per il disegno!!!
– si basa sulla versione 1.4 Adobe PDF
13
14. Classi che ci interessano
• CGPDFDocument
• CGPDFPage
• CGPDFObject
• CGContext
14
15. Caricamento del Pdf
#import <QuartzCore/QuartzCore.h>
NSURL *pdfURL = [[NSBundle mainBundle] URLForResource:@"TestPage.pdf"
withExtension:nil];
CGPDFDocumentRef pdf = CGPDFDocumentCreateWithURL((CFURLRef)pdfURL);
// Prendo la prima pagina
CGPDFPageRef page = CGPDFDocumentGetPage(pdf, 1);
CGPDFPageRetain(page);
// Determino la grandezza del PDF
CGRect pageRect = CGPDFPageGetBoxRect(page, kCGPDFMediaBox);
pdfScale = self.imageView.frame.size.width/pageRect.size.width;
pageRect.size = CGSizeMake(pageRect.size.width*pdfScale,
pageRect.size.height*pdfScale);
15
18. Scorrimento pagine
• Uso di scrollview con paginazione
• Creare una classe per la singola pagina
ereditando da UIView
• Pre-caricare più pagine ma...
• Attenzione alla memoria!
– Scaricare / Caricare una “finestra” di pagine
18
22. Gestire lo Zoom
• Scrollview con dentro Scrollviews :)
– Ogni pagina è una scrollview!
• Utilizzando per lo zoom il delegato:
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
22
23. Zoom con doppio tap
• Intercettarlo tramite touchesBegan
• Permettere lo zoom in base a dove si è
fatto il tap!
• Tornare a zoom scale = 1 con ulteriore
doppio tap
23
27. CATiledLayer
• Presente dentro QuartzCore!
• Poca documentazione (4 properties, 1 Class Method)
• Esempio: Applicazione Mappe
• Ogni view possiede un CALayer
– CATiledLayer è una sottoclasse di CALayer!
• Per il disegno usare drawLayer:inContext:
27
28. LevelofDetail e LevelOfDetailBias
• Level Of Detail il num di livelli di dettaglio per il layer
• Level Of Detail Bias è il num di livelli magnified di dettaglio per il
layer
• Ogni LODB/LOD è una potenza di due o più rispetto al livello di
dettaglio
28
29. LevelofDetail e LevelOfDetailBias
• Level Of Detail il num di livelli di dettaglio per il layer
• Level Of Detail Bias è il num di livelli magnified di dettaglio per il
layer
• Ogni LODB/LOD è una potenza di due o più rispetto al livello di
dettaglio
28
30. TileSize
• E’ la grandezza massima di ogni
singolo tile usato nel layer
• Di base è 256x256
• Ci sono problemi con iPad 3 :(
29
31. LevelofDetail e LevelOfDetailBias
• UIScrollview con zoom
– minimumZoomScale 0.125f
– maximumZoomScale 8.0f
– Zoom di fattore 8
• Potremmo scegliere LevelOfDetail 7 e LevelOfDetailBias 3
– 7 configurazioni di level of detail
– ogni livello è la metà di risoluzione del precedente
– primi 3 sono a risoluzione “magnified”
– il 4 è a risoluzione normale
– gli ultimi 3 sono a risoluzione ridotta
30
36. Metadati
• Dalle specifiche sono presenti al capitolo
10.2 Metadata
• Sono in un formato “particolare”
• Si possono estrarre con CoreGraphics 8-)
1 0 obj
<< /Title ( PostScript Language Reference, Third Edition )
/Author (Adobe Systems Incorporated)
/Creator (Adobe FrameMaker 5.5.3 for Power Macintosh®) /Producer (Acrobat Distiller
3.01 for Power Macintosh) /CreationDate (D:19970915110347-08'00')
/ModDate (D:19990209153925-08'00')
>> endobj
35
38. Titolo ed autore del pdf
CGPDFDictionaryRef info = CGPDFDocumentGetInfo(pdf);
CGPDFStringRef titleStringRef;
CGPDFDictionaryGetString(info, "Title", &titleStringRef);
const unsigned char *titleCstring =
CGPDFStringGetBytePtr(titleStringRef);
printf("Titolo: %s", titleCstring);
CGPDFStringRef authorStringRef;
CGPDFDictionaryGetString(info, "Author", &authorStringRef);
const unsigned char *authorCstring =
CGPDFStringGetBytePtr(authorStringRef);
printf("nAutore: %s", authorCstring);
37
39. Accesso ai dati PDF
• CGPDFDocument
• CGPDFDocumentGetCatalog
• CGPDFPage
• CGPDFPageGetDictionary
• CGPDFObjectGetObject, CGPDFDictionaryGetBoolean,
CGPDFDictionaryGetInteger, CGPDFDictionaryGetString,
CGPDFDictionaryGetArray...
38
40. Indice
• Non è sempre presente :)
• In base alla versione ed al formato
potrebbe cambiare... (gestire più casi!)
• Dalle specifiche presente nel capitolo
8.2 Document-Level Navigation
39