在缩放时向 pdf 添加内容的正确方法 ios

Correct way of adding contents to pdf on zooming ios

我正在使用一个以 pdf 格式显示地图的应用程序。因为我有基本地图 pdf (pdf1) 在上面我需要显示另一个 pdf (pdf2) 层有城市姓名。

我可以通过在视图上添加另一个 CATiledLayer 对象来实现,如下所示:

 NSString *filePath = [[NSBundle mainBundle]  pathForResource:fileName ofType:@"pdf"];
NSURL *pdfURL = [NSURL fileURLWithPath:filePath];
CGPDFDocumentRef myDocumentRef = CGPDFDocumentCreateWithURL((CFURLRef) pdfURL);
_PDFPageRef =  CGPDFDocumentGetPage(myDocumentRef, 1);


CATiledLayer *tiledLayer = [CATiledLayer layer];
tiledLayer.delegate = self;
tiledLayer.levelsOfDetail = 3; // Zoom levels

tiledLayer.levelsOfDetailBias = 3; // Bias
tiledLayer.backgroundColor = [UIColor clearColor].CGColor;
UIScreen *mainScreen = [UIScreen mainScreen]; // Main screen

CGFloat screenScale = [mainScreen scale]; // Main screen scale

CGRect screenBounds = [mainScreen bounds]; // Main screen bounds

CGFloat w_pixels = (screenBounds.size.width * screenScale);

CGFloat h_pixels = (screenBounds.size.height * screenScale);

CGFloat max = ((w_pixels < h_pixels) ? h_pixels : w_pixels);

CGFloat sizeOfTiles = ((max < 512.0f) ? 512.0f : 1024.0f);

tiledLayer.tileSize = CGSizeMake(sizeOfTiles, sizeOfTiles);
tiledLayer.frame =  CGRectIntegral(CGPDFPageGetBoxRect(_PDFPageRef,  kCGPDFCropBox));
[[self layer] addSublayer:tiledLayer];
[self setNeedsDisplay];

但是我在这里面临两个问题:

  1. 如果 pdf1 没有完全加载,而我在其上添加了另一个 pdf2,那么 pdf1 将永远不会被完全加载。会模糊。

  2. 如果pdf1完全加载,然后添加pdf2,放大3.4倍后,pdf1变模糊

请帮忙!!

我找到了在缩放时向 pdf 添加更多内容的解决方案。根据我的理解,我做错的是我在同一个视图上添加了另一个 CATiledLayer (tiledLayer) 对象,并且视图正在将这个对象视为当前的图块并且视图正在处理此图块 (tiledLayer)。这就是为什么前一个瓷砖的褪色视图变得不清晰的原因。

现在我使用同一个磁贴在其上添加更多细节。我使用了另一个 CGPDFPageRef 对象 (_PDFPageRef2)

CGPDFDocumentRef myDocumentRef = CGPDFDocumentCreateWithURL((CFURLRef) pdfURL);

_PDFPageRef2 =  CGPDFDocumentGetPage(myDocumentRef, 1);

之后我在视图上调用 setNeedsDisplay 方法

[self setNeedsDisplay];

该方法再次绘制视图,从而调用视图的-drawRect:方法,实现如下:

-(void)drawRect:(CGRect)rect { CGContextRef 上下文 = UIGraphicsGetCurrentContext();

float dpi = 100.0 / 72.0;

ReaderContentPage *readerContentPage = self; // Retain self

//  CGContextSetRGBFillColor(context, 1.0f, 1.0f, 1.0f, 1.0f); // White
CGContextSetFillColorWithColor(context, [UIColor clearColor].CGColor);
CGContextFillRect(context, CGContextGetClipBoundingBox(context)); // Fill

//NSLog(@"%s %@", __FUNCTION__, NSStringFromCGRect(CGContextGetClipBoundingBox(context)));

CGContextTranslateCTM(context, 0.0f, self.bounds.size.height); CGContextScaleCTM(context, 1.0f, -1.0f);


CGContextConcatCTM(context, CGPDFPageGetDrawingTransform(_PDFPageRef, kCGPDFCropBox, self.bounds, 0, true));

//CGContextSetRenderingIntent(context, kCGRenderingIntentDefault); CGContextSetInterpolationQuality(context, kCGInterpolationDefault);

CGContextDrawPDFPage(context, _PDFPageRef); // Render the PDF1 page into the context
if (_PDFPageRef2) {
    CGContextConcatCTM(context, CGPDFPageGetDrawingTransform(_PDFPageRef2, kCGPDFCropBox, self.bounds, 0, true));

    //CGContextSetRenderingIntent(context, kCGRenderingIntentDefault); CGContextSetInterpolationQuality(context, kCGInterpolationDefault);

    CGContextDrawPDFPage(context, _PDFPageRef2); // Render the PDF2 page into the context

}
if (readerContentPage != nil) readerContentPage = nil; // Release self
                                                       //    UIGraphicsPushContext(context);
                                                       //    CGSize size = CGSizeMake(320, 480); //Screen Size on iPhone device
                                                       //    UIGraphicsBeginImageContext(size);  //Create a new Bitmap-based graphics context (also makes this the current context)

}

因此,我可以在缩放时向 pdf 添加更多详细信息。