在缩放时向 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];
但是我在这里面临两个问题:
如果 pdf1 没有完全加载,而我在其上添加了另一个 pdf2,那么 pdf1 将永远不会被完全加载。会模糊。
如果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 添加更多详细信息。
我正在使用一个以 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];
但是我在这里面临两个问题:
如果 pdf1 没有完全加载,而我在其上添加了另一个 pdf2,那么 pdf1 将永远不会被完全加载。会模糊。
如果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 添加更多详细信息。