2013-07-21 130 views
1

我已經撰寫了pdfGenerator類來呈現整個UITableView以生成PDF。iOS:將UITableView渲染爲PDF

用法:

[pdfGenerator createPDFFromTableview:self.tableView]; 

類方法:

- (void)createPDFFromTableview:(UITableView *)tableview { 
    [tableview scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:NO]; 
    [self renderTableView:tableview]; 

    int rows = [tableview numberOfRowsInSection:0]; 
    int numberofRowsInView = 17; 
    for (int i = 0; i < rows/numberofRowsInView; i++) { 
     [tableview scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:(i+1)*numberofRowsInView inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:NO]; 
     [self renderTableView:tableview]; 
    } 
} 

- (void)renderTableView:(UITableView*)tableview { 
    UIGraphicsBeginImageContext(tableview.frame.size); 
    [tableview.layer renderInContext:UIGraphicsGetCurrentContext()]; 
    UIImage *tableviewImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    UIGraphicsBeginPDFPage(); 
    [tableviewImage drawInRect:tableview.frame]; 
} 
正確

此代碼滾動的tableview,但它僅適用於第一頁和其餘的網頁創建PDF來了空白!我不知道爲什麼會發生這種情況,它應該將當前的uitableview快照視爲並渲染,但它似乎只對第一頁執行此操作。有人能指出什麼可能是錯的嗎?有沒有更好的方法來做我想要達到的目標?

[編輯]

以下給出了相同的結果;

int totalRows = [tableview numberOfRowsInSection:0]; 
int totalVisibleRows = 17; 
for (int i = 0; i < ceil((float)totalRows/totalVisibleRows); i++) { 
    [tableview scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:i * totalVisibleRows inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:NO]; 

    [pdfGenerator renderTableView:tableview indexPathStart:[NSIndexPath indexPathForRow:i * totalVisibleRows inSection:0] indexPathEnd:[[tableview indexPathsForVisibleRows] lastObject]]; 
} 

- (void)renderTableView:(UITableView*)tableview indexPathStart:(NSIndexPath *)startingIndexPath indexPathEnd:(NSIndexPath *)endIndexPath { 
    CGRect rectToDraw = CGRectUnion([tableview rectForRowAtIndexPath:startingIndexPath], [tableview rectForRowAtIndexPath:endIndexPath]); 

    NSLog(@"%@", NSStringFromCGRect(rectToDraw)); 

    UIGraphicsBeginImageContext(rectToDraw.size); 
    [tableview.layer renderInContext:UIGraphicsGetCurrentContext()]; 
    UIImage *tableviewImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    UIGraphicsBeginPDFPage(); 
    [tableviewImage drawInRect:rectToDraw]; 
} 

輸出rectToDraw:

{{0, 0}, {768, 720}} 
{{0, 680}, {768, 720}} 
{{0, 1360}, {768, 720}} 
{{0, 2040}, {768, 360}} 

回答

0

你的圖形上下文初始化爲UITableView的框架,所以它會經常看「第一頁」。以下「頁面」的圖形上下文需要您的UITableView的內部UIScrollView的上下文偏移量。如果沒有任何技巧直接訪問UIScrollView,我建議你使用[UITableView rectForRowAtIndexPath:]方法來獲取想要在步驟(即頁面)中繪製的第一行和最後一行的CGRect,並且它們可以得到一個包含(和通過中間的所有行)。

編輯(的要求,在評論): 你會基本上是在循環使用類似的東西

[self renderTableView:tableview 
     indexPathStart:[NSIndexPath indexPathForRow:row inSection:0] 
     indexPathEnd:[[tableview indexPathsForVisibleRows] lastObject]]; 

而且你的渲染方法,然後會像更換渲染消息:

- (void)renderTableView:(UITableView*)tableview indexPathStart:(NSIndexPath *)startingIndexPath indexPathEnd:(NSIndexPath *)endIndexPath{ 
    CGRect rectToDraw = CGRectUnion([tableview rectForRowAtIndexPath:startingIndexPath], [tableview rectForRowAtIndexPath:endIndexPath]); 
    NSLog(@"%@", NSStringFromCGRect(rectToDraw)); 
    //... 
} 

至於你對索引路徑的問題。 indexPath.row將不總是0-16。它們將是0-16,17-34,35-51等。這也反映了你的上下文,即你想繪製相關的indexPath矩形的矩形,因爲這是'地點',其中支持UITableView有當前渲染圖形的後備存儲。不知道您的PDF繪圖例程,您可能還需要檢查您的繪圖矩陣。

+0

我不確定你的意思,但是在我的情況下,在滾動tableview之前和之後indexpath總是相同的,即0到16(因爲一次總共有17行)。滾動之後,它們也會像重用細胞一樣。只是內容會有所不同,這是我感興趣的內容。我錯過了一些嗎?你可以通過給出示例代碼更加精確。 – applefreak

+0

它給出了相同的結果。請參閱編輯的問題。感謝您對此問題的關注。 – applefreak

1

我以編程方式滾動tableview後最終呈現持有tableview的視圖。渲染tableview似乎沒有工作後滾動!

+0

嗨@applefreak你可以發佈你的解決方案嗎?我有點卡住這個相同的問題! –