2016-09-14 4 views
0

Я работаю в приложении, которое отображает карту в формате pdf. В том, что у меня есть базовая карта pdf (pdf1), поверх которой мне нужно показать еще один слой, который имеет название города, (pdf2).Правильный способ добавления содержимого в pdf при масштабировании ios

Я могу сделать это, добавив еще один объект 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 становится размытым.

Map with pdf1 Map with pdf2 added on pdf1

Пожалуйста, помогите !!

ответ

0

У меня есть решение для добавления большего количества содержимого в pdf при масштабировании. По моему пониманию, то, что я делал неправильно, я добавлял еще один объект CATiledLayer (tiledLayer) на том же самом представлении, и в представлении рассматривался этот объект, поскольку текущая плитка и представление работали над этой плитой (tiledLayer). Вот почему увядший вид предыдущей плитки не стал ясен.

Теперь я использую одну и ту же плиту для добавления более подробной информации поверх нее. Я использовал другой объект CGPDFPageRef (_PDFPageRef2)

CGPDFDocumentRef myDocumentRef = CGPDFDocumentCreateWithURL((CFURLRef) pdfURL); 

_PDFPageRef2 = CGPDFDocumentGetPage(myDocumentRef, 1); 

После этого я вызываю setNeedsDisplay метод на представлении

[self setNeedsDisplay]; 

Этот метод рисует вид снова и, таким образом, называют -drawRect: метод представления, реализация которого такова, как показано ниже:

- (void) drawRect: (CGRect) rect { CGContextRef context = 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 на масштабирование.

enter image description here