2015-10-06 7 views
6

Mam ten kod tutaj, który bierze moje UIView w umieszcza to do PDF. Mój problem polega na tym, że mój widok jest kontrolerem widoku szczegółów i jest przewijalny, a plik PDF dostaje tylko to, co znajduje się wewnątrz kontrolera widoku szczegółów, a nie pełny widok, jeśli poruszę się w widoku szczegółowym, przechwyci część jestem na, nie w pełni. Czy to, co próbuję zrobić, jest możliwe?Objective-C Pełny UIView do 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

byłem naprawdę borykają się z tym, że nie może uzyskać pełny wgląd do pliku PDF, mam również na myśli o wyjeździe do trasie biorąc moją i mojego NSMutableArray NSArray które są dane używane w moim UIView i staram się ukryć to w pliku PDF, ale to brzmi bardzo czasochłonnie, aby go dobrze sformatować, chyba że ktoś wie, jak to zrobić. Sądzę, że jestem zdezorientowany, jaką drogę powinienem wybrać.

+0

Więc co chcesz w rzeczywistości nie jest „pełna UIView”, jest to kompilacja jednego UIView w kilka różnych państw? Czego używasz do kontrolera widoku szczegółów? Która klasa? – Tommy

+0

Czy próbowałeś użyć rozmiaru zawartości arkusza kalkulacyjnego zamiast granic? – Sheamus

+0

Jaka jest hierarchia "SpreadSheet"? jeśli jest to widok tabeli lub widok kolekcji, nie ma prostego sposobu, aby to zrobić, ponieważ komórki, które nie są widoczne, nie są jeszcze renderowane. – Aris

Odpowiedz

1

Rendering czegoś w kontekście renderuje tylko to, co aktualnie znajduje się w hierarchii widoku. Oznacza to, że jeśli używasz UITableView lub UICollectionView, nie każda komórka reprezentująca twoje dane jest w hierarchii w danym momencie. Gdyby to był ja, spróbowałbym tymczasowo ustawić widok tak, aby miał masywną ramkę, aby wszystko znajdowało się w hierarchii. Gdyby to nie zadziałało, pisałem niestandardowy widok, który na żądanie mógł układać wszystko dla wszystkich danych, a następnie zresetować do bardziej wydajnego układu po zakończeniu renderowania.

0

Spróbuj użyć następującego kodu, aby przekonwertować UIView na PDF.

Należy zauważyć, że poniższa metoda tworzy tylko bitmapę widoku; nie tworzy prawdziwej typografii.

-(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); 
} 

także upewnić się, że import: QuartzCore/QuartzCore.h

2

Od tego

Mój problem mam jest to, że moim zdaniem jest kontrolerem zobacz szczegóły i jest przewijana i PDF dostaje tylko co wewnątrz widoku szczegółów kontroler w tym czasie, a nie pełny widok.

Wygląda na to, że problem dotyczy treści, którą można przewijać, a tworzenie plików PDF to tylko przechwytywanie widocznego obszaru.

Oto problem

UIGraphicsBeginPDFContextToData (pdfData, spreadSheet.bounds, nil);

Musisz go naprawić, aby nadać przewijany widok (UITableView, UICollectionView lub Scrollview) granicom rozmiarów treści tutaj, jak to zrobić.

-(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; 
} 

Powyższy kod wygeneruje jedną stronę. Na wielu stronach użyć poniższy kod

//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(); 

Można również zajrzeć do tego projektu roboczego ScrollViewToPDF. Używa tej samej warstwy przewijania, co renderInContext, ale tutaj PDF jest tworzony zgodnie z wymaganiami użytkownika, np. Jeden plik PDF lub wiele stron PDF. Przechwytuje wszystko widać jak niewidzialna część Scrollview

+0

czy możesz umieścić to w Swift? dzięki! – Derry