【问题标题】:iOS: Rendering UITableView into PDFiOS:将 UITableView 渲染成 PDF
【发布时间】:2013-07-20 05:11:19
【问题描述】:

我已经编写了 pdfGenerator 类来渲染整个 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}}

【问题讨论】:

    标签: ios ipad uitableview pdf-generation core-graphics


    【解决方案1】:

    在以编程方式滚动 tableview 后,我最终渲染了持有 tableview 的视图。滚动后渲染 tableview 似乎不起作用!

    【讨论】:

    • 嗨@applefreak 你能发布你的解决方案吗?我有点被同样的问题困住了!
    【解决方案2】:

    您的图形上下文是用UITableView 的框架初始化的,因此它将始终查看“第一页”。以下“页面”的图形上下文需要UITableView 的内部UIScrollView 的上下文偏移量。除非有任何技巧可以直接访问 UIScrollView,否则我建议您使用 [UITableView rectForRowAtIndexPath:] 方法获取要在步骤(即页面)中绘制的第一行和最后一行的 CGRects 并使用 CGRectUnion 它们获取一个矩形,这将包括两者(以及中间的所有行)。

    编辑(根据 cmets 的要求): 你基本上会用类似的东西替换循环中的渲染消息

    [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));
       //...
    }
    

    关于您关于 indexPaths 的问题。 indexPath.row 并不总是 0-16。它们将是 0-16、17-34、35-51 等。这也反映在您的上下文中,即您想要为相关的 indexPath 矩形绘制矩形,因为这是支持 @ 的图层的“位置” 987654329@ 具有当前渲染图形的后备存储。不知道您的 PDF 绘图例程,您可能还需要在那里检查您的绘图矩形。

    【讨论】:

    • 我不确定你的意思,但在我的情况下,滚动 tableview 之前和之后的 indexpath 总是相同的,即 0 到 16(因为一次总行数为 17)。滚动后,它们也将与重用单元格相同。只是内容会有所不同,这是我感兴趣的。我错过了一些吗?请提供示例代码,您能否更准确。
    • 它给出了相同的结果。请参阅已编辑的问题。感谢您对这个问题感兴趣。
    猜你喜欢
    • 2017-08-04
    • 2014-12-07
    • 1970-01-01
    • 1970-01-01
    • 2022-10-09
    • 1970-01-01
    • 2023-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多