我有一个iPad应用程序,我试图从UIView生成一个PDF,它几乎工作完美。
代码真的很简单如下:
UIGraphicsBeginPDFContextToFile( filename,bounds,nil ); UIGraphicsBeginpdfpage(); CGContextRef pdfContext = UIGraphicsGetCurrentContext(); [view.layer renderInContext:pdfContext]; UIGraphicsEndPDFContext();
这工作真的很好与一个奇怪的异常。如果视图在渲染到PDF之前已经在屏幕上,则视图上的UILabels将作为精彩向量呈现到PDF。如果视图还没有在屏幕上(IE的控制器是initWithNib等,但没有推送到导航控制器或任何东西),那么文本将呈现为位图在’ipad’分辨率。
这就像渲染到屏幕的行为设置视图,当我后来呈现为一个pdf上下文作为向量。
有没有一些方法我可以调用或属性我可以设置在视图或图层或其他地方模仿这种行为,而不必在屏幕上显示视图?
这是与UIViewPrintFormatter有关吗?
解决方法
我发现使它的标签被渲染为矢量化的唯一方法是使用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]; }