jks*_*ard 3 pdfkit ipad ios uibezierpath
我使用具有子类型墨迹的 PDFAnnotation() 类向 PDFDocument 添加墨迹注释。这个想法是捕获使用触摸绘制的签名。
受 UberSignature 的启发,我的 UIBezierPath 是一系列应该填充颜色的矩形。但是,当我将注释添加到 PDFDocument 时,它没有被填充。
当添加到 PDFAnnotation 时,UIBezierPath 的 fill() 方法似乎根本不执行任何操作?
如果我使用相同的 UIBezierPath 并将其绘制在 UIImage 上,它将正确填充纯色。
关于可能出什么问题的任何想法吗?
有问题的代码:
UIColor.red.setStroke()
UIColor.red.setFill()
var path = UIBezierPath()
path.append(myRectangles)
path.fill()
var annotation = PDFAnnotation(bounds: path.bounds, forType: .ink, withProperties: nil)
annotation.add(path)
myPDFPage.addAnnotation(annotation)
Run Code Online (Sandbox Code Playgroud)
在屏幕截图中,我尝试编写普通文本和两个示例行。左边的线画得慢,右边的线画得快。这个想法是让线条的宽度根据绘制的速度而变化,以使签名看起来更自然/真实。
我设法找到了一个似乎相对最佳的问题解决方案。
诀窍是创建 PDFAnnotation 的子类并覆盖 draw(with box:, in context:) 函数。在此函数中,我可以使用 drawPath(using: .fill) 方法来填充贝塞尔曲线路径。
代码可以如下所示:
class SignatureAnnotation : PDFAnnotation {
public var myPath : UIBezierPath = UIBezierPath()
override func draw(with box: PDFDisplayBox, in context: CGContext) {
context.saveGState()
self.page?.transform(context, for: box)
context.beginPath()
context.setLineWidth(0.1)
context.setShouldAntialias(true)
context.addPath(self.myPath.cgPath.mutableCopy()!)
context.drawPath(using: .fill)
context.restoreGState()
}
}
Run Code Online (Sandbox Code Playgroud)
将此注释(类型 .stamp)添加到 PDF 而不是墨迹注释,所有内容都将呈现为矢量(完全可缩放而不会像素化) - 并且在保存到文件或数据缓冲区时将与 PDF 的其余部分一起保存。
唯一的缺点是UIBezierPath不能太复杂,因为如果draw()函数花费太长时间就会引入闪烁。这可以通过简单地将 UIBezierPath 分成多个单独的路径(每个路径都有自己的注释)来解决。
| 归档时间: |
|
| 查看次数: |
1808 次 |
| 最近记录: |