擦除pdf上下文中的行

时间:2015-11-18 21:39:08

标签: swift uiview pdf-generation quartz-graphics erase

我正在尝试生成我的UIView的pdf。在视图中,我可以使用CGContextSetBlendMode(context,CGBlendMode.Clear)简单地擦除行。虽然当我绘制到pdf上下文(使用UIGraphicsBeginPDFContextToData生成)时,这在UIView的上下文中正常工作,但相同的代码会产生与CGContextSetStrokeColorWithColor中设置的颜色相同的行。有没有人知道在pdf上下文中实现擦除的另一种方法?

例如,当我在drawrect上下文中运行代码时,会产生一条微弱的红线(alpha = 0.5),并且红线上有一个小间隙。但是,如果我提供一个pdfcontext,它会变成一条微弱的红线,并有一条红色硬线穿过它(因为另一条稀疏的红线与alpha 0.5叠加)

    let path = CGPathCreateMutable()
    CGPathMoveToPoint(path, nil, 10, 10)
    CGPathAddLineToPoint(path, nil, 10,100)
    CGContextAddPath(context, path)

    CGContextSetLineCap(context, CGLineCap.Round)
    CGContextSetStrokeColorWithColor(context, UIColor.redColor().colorWithAlphaComponent(0.5).CGColor)
    CGContextSetLineWidth(context, 10.0)
    CGContextStrokePath(context)

    CGPathMoveToPoint(path, nil, 10, 10)
    CGPathAddLineToPoint(path, nil, 10,100)
    CGContextAddPath(context, path)

    CGContextSetBlendMode(context, CGBlendMode.Clear)
    CGContextSetLineWidth(context, 2.0)
    CGContextStrokePath(context)

1 个答案:

答案 0 :(得分:1)

我最终通过解决方法解决了我的问题。为了这个问题的任何其他人的利益,这里是。

我在PDFContext中单独绘制子视图。每个我检查它是否包含擦除。如果是这种情况,我打开一个单独的ImageContext并生成视图的图像。

UIGraphicsBeginImageContext(objectView.frame.size)
if let imageContext = UIGraphicsGetCurrentContext() {
    objectView.drawObjectInContext(imageContext,rect: objectView.bounds)
    self.applyEraser(imageContext, eraserShape: objectView.eraserLayer.eraseShape)
    let image = UIGraphicsGetImageFromCurrentImageContext()

    CGContextTranslateCTM(pdfContext, 0, objectView.bounds.height)
    CGContextScaleCTM(pdfContext, 1.0, -1.0)
    CGContextDrawImage(pdfContext, objectView.bounds, image.CGImage)
}
UIGraphicsEndImageContext()

请注意,与CGContext中的常规绘图相比,图像处于上升空间,这就是我调用CGContextTranslate和CGContextScale的原因。

缺点是您可以在PDF中获取子视图的图像,而不是简单的文本。但是,如果您分别为每个视图执行此操作,则可以在不作为文本或任何所需内容正确删除的情况下绘制视图。