首页 文章

使用QuartzCore在可缩放的CGPDF文档上绘制几何图形(圆形或矩形)

提问于
浏览
0

我试图从我的资源包中的CGContextRef生成的pdf文档上绘制触摸(鼠标点击) . 我从Apple zoomingpdfviewer开始,我有一个UIScrollView,Pdf由 CGContextDrawPDFPage(context, pdfPage); 生成

我还在scrollView上添加了一个CATiledLayer,每次在layoutSubviews中绘制它 - 当UIScrollView被缩放时 . 我有点困惑,我应该在scrollView CGContext或TileLayers上绘制鼠标点 .

  • 继续前进,我想在用户点击的pdf文档上添加一个rect / circle / point .
    刚开始我是:
    CGContextMoveToPoint(context, 5,5); CGContextSetLineWidth(context, 12.0f); CGContextSetStrokeColorWithColor(context, [[UIColor redColor] CGColor]); CGContextAddRect(context, CGRectMake(50, 50, 20, 50)); CGContextAddLineToPoint(context, 25, 5); CGContextStrokePath(context);

将其绘制到当前上下文中 . 同样我打算在用户点击时绘制 .
但是当我缩放并重绘TitledLayer以匹配缩放内容时,这些绘制的rect / circle消失 .
如果我没有错,那么CATiledLayer将被绘制在currentContext rects / circle之上 .

最终功能非常类似于 Map 应用程序,其中添加了平铺图层,但即使在缩放 Map 后,删除的点也完全位于同一位置 .

看到很多这样的帖子后,他们很失落drawing on scrollViewpdf iOS viewer .
有谁知道如何在pdf文档上绘制geomtry(rect / points)并保持它们的位置完全相同,即使PdfView放大和缩小?我应该将PDF格式转换为图像还是其他任何方式来执行此操作?

2 回答

  • 0

    在CoreAnimation上搜索并尝试了一些东西之后,我想出了CALayer:如果你想在zoomable PDF viewer上添加任何内容,

    1)添加UITapGestureRecognizer以处理单点触摸

    UITapGestureRecognizer *singleTapGestureRecognizer=[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTapOnScrollView:)];
        singleTapGestureRecognizer.numberOfTapsRequired=1;
        singleTapGestureRecognizer.delegate=self;
        [self addGestureRecognizer:singleTapGestureRecognizer];
        [singleTapGestureRecognizer requireGestureRecognizerToFail:doubleTapGestureRecognizer]; // added if you have a UITapGestureRecognizer for double taps
    

    2)只需在Tiled PDF视图中将新视图(圆形,矩形任何几何体)添加为图层

    [self.titledPdfView.layer addSublayer:view1.layer];

    您可以使用CGContext currentContext将几何视图子类化为绘制 . 当pdf放大/缩小时,这会自动重新定位图层

    我试图通过在drawLayer:(CALayer *)图层inContext:(CGContextRef)上下文绘制上下文添加视图titledPdfView类,它给出了位置错误

    如果要绘制可调整大小的TextView,arow,Line,也可以实现TouchesMoved,TouchesEnded方法 .

    我希望这对需要在Apple的ZoomingPDFViewer上绘制自定义对象的人有所帮助 .

  • 0

    进一步添加(如果有人到达这里),替换Apple代码
    TiledPdfView *titledPDFView = [[TiledPdfView alloc] initWithFrame:pageRect scale:pdfScale]; [titledPDFView setPage:pdfPage]; [self addSubview:titledPdfView]; [titledPDFView setNeedsDisplay]; [self bringSubviewToFront:titledPdfView]; self.titledPdfView = titledPDFView;
    用:

    titledPdfView = [[TiledPdfView alloc] initWithFrame:pageRect scale:pdfScale];
    [titledPdfView setPage:pdfPage];
    [self addSubview:titledPdfView];
    [self bringSubviewToFront:titledPdfView];
    

    我不知道为什么他们添加了一个类似于(类对象的成员对象)的视图限制了
    -(void)drawLayer:(CALayer*)layer inContext:(CGContextRef)context
    在缩放之前 . 我尝试使用setNeedsDisplay没有效果,然后替换它的工作原理 .
    ESP . 如果您想在TileLayer上绘制annots并且没有任何内容出现,这很烦人 . 希望这可以帮助!!

相关问题