我正在尝试生成我的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)
最佳答案
我最终用一种变通方法解决了我的问题。为了这个问题的其他人的利益,这里。
我在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 en CGContextScale的原因。
缺点是在PDF文件中获得子视图的图像,而不是简单的文本。但是,如果对每个视图分别执行此操作,则可以绘制视图,而无需作为文本或任何所需的内容进行正确擦除。