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

Jac*_*sey 27 pdf uiview ipad ios

我有一个iPad应用程序,我正在尝试从UIView生成一个PDF,它几乎完美地工作.

代码非常简单如下:

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

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

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

是否有一些我可以调用的方法或属性我可以在视图或图层或其他地方设置以模仿此行为而无需在屏幕上显示视图?

它与UIViewPrintFormatter有关吗?

mar*_*rux 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];
}
Run Code Online (Sandbox Code Playgroud)

这对我来说就是这个诀窍:标签在结果​​PDF视图中是未经过筛选和可选择的,并且在渲染到屏幕时表现正常.

  • 友情提醒你需要#import <QuartzCore/QuartzCore.h>进入你的UILabel子类 (3认同)
  • 我发现我需要在我的“UIView”及其子视图上递归调用“setNeedsDisplay”,这样当我调用“renderInContext:”时,视图会被重绘。否则永远不会调用`drawLayer:inContext:`,而是使用之前的光栅化层。此外,在调用 `renderInContext:` 后,需要在视图及其子视图上再次递归调用 `setNeedsDisplay`,以便再次正确渲染以再次显示在屏幕上。 (2认同)