2015-10-06 15 views
6

Ho questo codice qui che prende il mio UIView in mette in un PDF. Il mio problema è che il mio punto di vista è un controller di visualizzazione di dettaglio ed è scorrevole e il PDF ottiene solo ciò che nel controller della vista di dettaglio in quel momento e non una visione completa, se mi muovo nella vista di dettaglio, catturerà qualunque cosa parte su cui sono, non la cosa completa. È quello che sto cercando di fare?Objective-C Full UIView to PDF

- (IBAction)Share:(id)sender { 

    NSMutableData *pdfData = [NSMutableData data]; 

    // Points the pdf converter to the mutable data object and to the UIView to be converted 
    UIGraphicsBeginPDFContextToData(pdfData, spreadSheet.bounds, nil); 
    UIGraphicsBeginPDFPage(); 
    CGContextRef pdfContext = UIGraphicsGetCurrentContext(); 


    // draws rect to the view and thus this is captured by UIGraphicsBeginPDFContextToData 

    [spreadSheet.layer renderInContext:pdfContext]; 

    // remove PDF rendering context 
    UIGraphicsEndPDFContext(); 

    // Retrieves the document directories from the iOS device 
    NSArray* documentDirectories = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES); 

    NSString* documentDirectory = [documentDirectories objectAtIndex:0]; 
    NSString* documentDirectoryFilename = [documentDirectory stringByAppendingPathComponent:@"test.pdf"]; 

    // instructs the mutable data object to write its context to a file on disk 
    [pdfData writeToFile:documentDirectoryFilename atomically:YES]; 
    NSLog(@"documentDirectoryFileName: %@",documentDirectoryFilename); 


    UIActivityViewController * activityController = [[UIActivityViewController alloc] initWithActivityItems:@[pdfData] applicationActivities:nil]; 

    UIPopoverController *popup = [[UIPopoverController alloc] initWithContentViewController:activityController]; 

    [popup presentPopoverFromRect:CGRectMake(self.view.frame.size.width - 36, 60, 0, 0)inView:self.view permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES]; 

} 

UPDATE

Sono stato davvero lottando con questo, non riesco a ottenere la visualizzazione completa in un PDF, ho anche pensato di andare in rotta di prendere la mia e la mia NSMutableArray NSArray quali sono i dati utilizzati nel mio UIView e cerco di copiarlo in un PDF, ma sembra molto dispendioso in termini di tempo per renderlo piacevole, a meno che qualcuno non sappia come farlo. Immagino di essere confuso su quale strada dovrei prendere.

+0

Quindi, ciò che si vuole, non è in realtà il "UIView pieno", è una raccolta di uno UIView in un mucchio di diversi stati? Cosa stai usando per il tuo controller di visualizzazione di dettaglio? Quale classe? – Tommy

+0

Hai provato a utilizzare la dimensione del contenuto del foglio di calcolo anziché i limiti? – Sheamus

+0

Qual è la gerarchia di "spreadSheet"? se è una vista tabella o una vista raccolta che non c'è un modo semplice per farlo perché le celle che non sono visibili non sono ancora visualizzate. – Aris

risposta

1

Il rendering di qualcosa in un contesto restituisce solo ciò che è attualmente nella gerarchia della vista. Ciò significa che se utilizzi uno UITableView o UICollectionView, non tutte le celle che rappresentano i tuoi dati si trovano nella gerarchia in un dato momento. Se fossi in me proverei temporaneamente ad impostare la vista per avere una cornice enorme in modo che tutto sia nella gerarchia. Se ciò non funzionasse, scriverei una vista personalizzata che, su richiesta, potrebbe impaginare tutto per tutti i dati e quindi ripristinare un layout più efficiente una volta completato il rendering.

0

Provare il seguente codice per convertire UIView in PDF.

Si noti che il metodo seguente crea solo una bitmap della vista; non crea una tipografia attuale.

-(void)createPDFfromUIView:(UIView*)aView saveToDocumentsWithFileName:(NSString*)aFilename 
{ 
    // Creates a mutable data object for updating with binary data, like a byte array 
    NSMutableData *pdfData = [NSMutableData data]; 

    // Points the pdf converter to the mutable data object and to the UIView to be converted 
    UIGraphicsBeginPDFContextToData(pdfData, aView.bounds, nil); 
    UIGraphicsBeginPDFPage(); 
    CGContextRef pdfContext = UIGraphicsGetCurrentContext(); 


    // draws rect to the view and thus this is captured by UIGraphicsBeginPDFContextToData 

    [aView.layer renderInContext:pdfContext]; 

    // remove PDF rendering context 
    UIGraphicsEndPDFContext(); 

    // Retrieves the document directories from the iOS device 
    NSArray* documentDirectories = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES); 

    NSString* documentDirectory = [documentDirectories objectAtIndex:0]; 
    NSString* documentDirectoryFilename = [documentDirectory stringByAppendingPathComponent:aFilename]; 

    // instructs the mutable data object to write its context to a file on disk 
    [pdfData writeToFile:documentDirectoryFilename atomically:YES]; 
    NSLog(@"documentDirectoryFileName: %@",documentDirectoryFilename); 
} 

assicurarsi di importazione anche: QuartzCore/QuartzCore.h

2

Da questo

Il mio problema che sto avendo è che il mio punto di vista è un controller particolare visione e è scorrevole e il PDF ottiene solo ciò che all'interno della vista di dettaglio del controller in quel momento e non a pieno schermo.

Sembra che il problema sia il contenuto in visualizzazione è scorrevole e il file PDF che si sta creando è solo l'area visibile.

Qui è il vostro problema

UIGraphicsBeginPDFContextToData (pdfData, spreadSheet.bounds, nullo);

È necessario risolvere il problema è necessario dargli la vista scorrevole (UITableView, UICollectionView o Scrollview) limiti di dimensione del contenuto ecco come lo fai.

-(NSData*)pdfDataFromTableViewContent 
{ 
    NSMutableData *pdfData = [NSMutableData data]; 
    //The real size, not only the visible part use your scrollable view ((UITableView,UICollectionView or Scrollview)) 
    CGSize contentSize = self.tableView.contentSize; 
    CGRect tableViewRealFrame = self.tableView.frame; 
    //Size tableView to show the whole content 
    self.tableView.frame = CGRectMake(0, 0, contentSize.width, contentSize.height); 
    //Generate PDF (one page) 
    UIGraphicsBeginPDFContextToData(pdfData,self.tableView.frame, nil); 
    UIGraphicsBeginPDFPage(); 
    [self.tableView.layer renderInContext:UIGraphicsGetCurrentContext()]; 
    UIGraphicsEndPDFContext(); 
    //Resize frame 
    self.tableView.frame = tableViewRealFrame; 
    return pdfData; 
} 

Il codice sopra genererà una pagina. Per più pagine utilizzare seguente codice

//MultiPage 
CGRect mediaBox = self.tableView.frame; 
CGSize pageSize = CGSizeMake(self.view.frame.size.width, 800); 
UIGraphicsBeginPDFContextToData(pdfData, CGRectZero, nil); 
CGContextRef pdfContext = UIGraphicsGetCurrentContext(); 
NSInteger currentPage = 0; 
BOOL done = NO; 
do { 
    UIGraphicsBeginPDFPageWithInfo(CGRectMake(0, 0.0, pageSize.width, pageSize.height), nil); 
    CGContextTranslateCTM(pdfContext, 0, -(pageSize.height*currentPage)); 
    [self.view.layer renderInContext:pdfContext]; 
    if ((pageSize.height*(currentPage+1)) > mediaBox.size.height) done = YES; 
    else currentPage++; 
} while (!done); 
UIGraphicsEndPDFContext(); 

Si può anche guardare in questo progetto di lavoro ScrollViewToPDF. Utilizza il layer di rendering dello stesso renderingInContext ma qui il PDF viene creato in base alle vostre esigenze, ad esempio PDF di una pagina o PDF di più pagine. Cattura tutte visibili così come la parte invisibile del ScrollView

+0

puoi metterlo giù in Swift? Grazie! – Derry