将UIView渲染为PDF作为iPad上的矢量 - 有时渲染为位图,有时渲染为矢量

时间:2011-06-21 09:25:16

标签: ios ipad pdf uiview

我有一个iPad应用程序,我正在尝试从UIView生成PDF,而且几乎正常工作。

代码非常简单如下:

UIGraphicsBeginPDFContextToFile( filename, bounds, nil );
UIGraphicsBeginPDFPage();
CGContextRef pdfContext = UIGraphicsGetCurrentContext();
[view.layer renderInContext:pdfContext];
UIGraphicsEndPDFContext();

这非常适用于一个奇怪的例外。如果在渲染为PDF之前视图已在屏幕上,则视图上的UILabel将作为精彩向量呈现给PDF。如果视图尚未出现在屏幕上(IE控制器是initWithNib等,但尚未被推入导航控制器或任何东西),则文本将以'ipad'分辨率呈现为位图。

当我随后将其渲染为pdf上下文时,就像渲染到屏幕的行为将视图设置为矢量一样。

我可以在视图或图层或其他地方设置一些我可以调用的属性或属性来模仿这种行为,而不必在屏幕上显示视图吗?

是否与UIViewPrintFormatter有关?

5 个答案:

答案 0 :(得分:23)

我发现制作它的唯一方法是使标签呈现矢量化是使用UILabel的子类,使用以下方法:

/** Overriding this CALayer delegate method is the magic that allows us to draw a vector version of the label into the layer instead of the default unscalable ugly bitmap */
- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx {
    BOOL isPDF = !CGRectIsEmpty(UIGraphicsGetPDFContextBounds());
    if (!layer.shouldRasterize && isPDF)
        [self drawRect:self.bounds]; // draw unrasterized
    else
        [super drawLayer:layer inContext:ctx];
}

这对我有用:标签在结果​​PDF视图中没有被标注并可选择,并且在渲染到屏幕时表现正常。

答案 1 :(得分:1)

如果您在屏幕上添加视图但在屏幕外坐标处怎么样?这似乎更像是一个黑客,但它可能会奏效。

答案 2 :(得分:1)

我想建议一个替代mprudhom的伟大解决方案: 使用UIString扩展名,您还可以将UILabel中的文字渲染为字体(使用select'n'copy支持等) 这样,字体的字形就可以正确嵌入到PDF中。

为了支持右对齐和居中文本对齐以及默认的垂直居中对齐,我必须计算drawInRect方法的边界框。

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx
{
    BOOL isPDF = !CGRectIsEmpty(UIGraphicsGetPDFContextBounds());

    if (!layer.shouldRasterize && isPDF) {
        // [self drawRect:self.bounds];

        CGSize fitSize = [self sizeThatFits:self.bounds.size];
        float x = self.bounds.origin.x;
        float y = self.bounds.origin.y;

        if (self.textAlignment == NSTextAlignmentCenter) {
            x += (self.bounds.size.width  - fitSize.width)  / 2.0f;
            y += (self.bounds.size.height - fitSize.height) / 2.0f;
        } else if (self.textAlignment == NSTextAlignmentRight) {
            x += self.bounds.size.width  - fitSize.width;
            y += self.bounds.size.height - fitSize.height;
        }
        [self.textColor set];
        [self.text drawInRect:CGRectMake(x, y, fitSize.width, fitSize.height) withFont:self.font lineBreakMode:NSLineBreakByWordWrapping alignment:self.textAlignment];
    } else {
        [super drawLayer:layer inContext:ctx];
    }
}

答案 3 :(得分:-1)

使用drawInContext而不是renderInContext

答案 4 :(得分:-2)

尝试使用视图的viewPrintFormatter。

而不是[view.layer renderInContext:pdfContext];

试试这个

CALayer* formattedLayer = [view viewPrintFormatter].view.layer;
[formattedLayer renderInContext:pdfContext];