如何覆盖 PDFAnnotation IOS-PDFKIT 上的绘制方法

Posted

技术标签:

【中文标题】如何覆盖 PDFAnnotation IOS-PDFKIT 上的绘制方法【英文标题】:How to override draw method on PDFAnnotation IOS-PDFKIT 【发布时间】:2020-08-06 12:06:20 【问题描述】:

我关注了另一个 *** 帖子,该帖子解释了如何覆盖 PDFAnnotation 的 draw 方法,以便我可以绘制图片而不是传统的 PDFAnnotation。

但遗憾的是,我无法做到这一点,并且在我的 pdf 顶部绘制的注释仍然是常规注释。

这是我使用的代码:

@implementation PDFImageAnnotation  UIImage * _picture;
                            CGRect _bounds;;


-(instancetype)initWithPicture:(nonnull UIImage *)picture bounds:(CGRect) bounds
    self = [super initWithBounds:bounds
                  forType:PDFAnnotationSubtypeWidget
                  withProperties:nil];

    if(self)
        _picture = picture;
        _bounds = bounds;
    
    return  self;



- (void)drawWithBox:(PDFDisplayBox) box
          inContext:(CGContextRef)context 
    [super drawWithBox:box inContext:context];
    [_picture drawInRect:_bounds];
    
    CGContextRestoreGState(context);
    UIGraphicsPushContext(context);
    
;

@end

有人知道我可以如何覆盖 draw 方法以便绘制自定义注释吗?

谢谢!

ps:我也尝试按照苹果开发网站上的教程进行操作。

更新:

现在我可以使用CGContextDrawImage 绘制图片,但我无法将坐标翻转回原位。当我这样做时,我的图片没有被绘制出来,而且似乎它们被放在了页面之外,但我不确定。

这是我的新代码:

- (void)drawWithBox:(PDFDisplayBox) box
          inContext:(CGContextRef)context 
    [super drawWithBox:box inContext:context];
    
    UIGraphicsPushContext(context);
    CGContextSaveGState(context);
    
    
    CGContextTranslateCTM(context, 0.0, _pdfView.bounds.size.height);
    CGContextScaleCTM(context, 1.0,  -1.0);
    
    CGContextDrawImage(context, _bounds, _picture.CGImage);


    CGContextRestoreGState(context);
    UIGraphicsPopContext();

【问题讨论】:

【参考方案1】:

我也尝试按照 Apple 开发网站上的教程进行操作。

哪一个?

Custom Graphics Adding Custom Graphics to a PDF

因为两者都包含 UIGraphicsPushContext(context)CGContextSaveGState(context) 调用,但您的代码不包含。不要盲目复制和粘贴示例,尝试理解它们。阅读这两个调用的作用。

固定代码:

- (void)drawWithBox:(PDFDisplayBox) box
          inContext:(CGContextRef)context 
    [super drawWithBox:box inContext:context];
    
    UIGraphicsPushContext(context);
    CGContextSaveGState(context);
    
    [_picture drawInRect:_bounds];

    CGContextRestoreGState(context);
    UIGraphicsPopContext();

图像是使用CGRectMake(20, 20, 100, 100) 绘制的。它是颠倒的,因为PDFPage 坐标被翻转(0, 0 = 底部/左侧)。把它作为 OP 的练习。

旋转

您的轮换代码错误:

CGContextTranslateCTM(context, 0.0, _pdfView.bounds.size.height);
CGContextScaleCTM(context, 1.0,  -1.0);
    
CGContextDrawImage(context, _bounds, _picture.CGImage);

它基于_pdfView 边界,但它应该基于图像边界 (_bounds)。这是正确的:

- (void)drawWithBox:(PDFDisplayBox) box
          inContext:(CGContextRef)context 
    [super drawWithBox:box inContext:context];
    
    UIGraphicsPushContext(context);
    CGContextSaveGState(context);

    CGContextTranslateCTM(context, _bounds.origin.x, _bounds.origin.y + _bounds.size.height);
    CGContextScaleCTM(context, 1.0, -1.0);
    [_picture drawInRect:CGRectMake(0, 0, _bounds.size.width, _bounds.size.height)];

    CGContextRestoreGState(context);
    UIGraphicsPopContext();

【讨论】:

感谢您的帮助!同样在阅读了很多关于我的问题后,我发现 CGContextDrawImage() 在我的情况下非常有效^^ 我尝试使用CGContextTranslateCTM 和`` CGContextScaleCTM`` 来翻转PDFPage 坐标,正如苹果网站上所解释的那样,但之后我无法绘制任何东西。我想我做错了什么,但我不知道是什么 查看更新的答案,您使用了错误的框架。您应该使用要在其中绘制图像的框架。

以上是关于如何覆盖 PDFAnnotation IOS-PDFKIT 上的绘制方法的主要内容,如果未能解决你的问题,请参考以下文章

Swift 4 - PDFAnnotation 文本(或 UITextField)是文本的大小

擦除使用 pdfkit 添加的 pdfAnnotation

如何在PDF中定义注释

如何在pdfkit swift中添加圆形注释?

iOS 11 PDFKit 墨水注释 - 无法填充 UIBezierPath

如何提高 atpg 故障覆盖率