Рендеринг PDF документа с 200 страницами на iPad - PullRequest
1 голос
/ 15 февраля 2011

Мне нужно разработать приложение, которое принимает PDF в качестве входных данных, этот документ PDF имеет 200 страниц. Я использую UIScrollView, чтобы провести пальцем влево и вправо. На каждом прикосновении я рисую документ PDF. Код как под:

- (id)initWithFrame:(CGRect)frame content:(NSString *)aPDFPage type:(NSString *)contentType
{
    if ((self = [super initWithFrame:frame])) 
    {
        // Initialization code
        self.backgroundColor = [UIColor whiteColor];
        pageRef = [[NSString alloc]initWithString:aPDFPage];
        pageTypeRef = [[NSString alloc]initWithString:contentType];
    }
    return self;
}


- (void)drawRect:(CGRect)rect 
{
    ctx = UIGraphicsGetCurrentContext();
    [self drawPDF];
}

-(void)drawPDF
{
    NSString *pathToPdfDoc = [[NSBundle mainBundle] pathForResource:self.pageRef ofType:self.pageTypeRef];
    NSURL *pdfUrl = [NSURL fileURLWithPath:pathToPdfDoc];

    document = CGPDFDocumentCreateWithURL((CFURLRef)pdfUrl);

    page = CGPDFDocumentGetPage(document, 1);
    CGContextTranslateCTM(ctx, 0.0, [self bounds].size.height);
    CGContextScaleCTM(ctx, 1.0, -1.0);

    CGAffineTransform transform = aspectFit(CGPDFPageGetBoxRect(page, kCGPDFTrimBox),CGContextGetClipBoundingBox(ctx));

    CGContextConcatCTM(ctx, transform);

    CGContextSetInterpolationQuality(ctx, kCGInterpolationLow); 
    CGContextSetRenderingIntent(ctx, kCGRenderingIntentDefault);

    CGContextDrawPDFPage(ctx, page);
    CGPDFDocumentRelease(document);
}


-(void)dealloc 
{
    [pageRef release];
    [pageTypeRef release];
    [super dealloc];
}

Это отлично работает. Но если я проведу очень быстро, чаще последующие страницы не загружаются мгновенно. Экран становится белым.

Как решить эту проблему, пожалуйста, руководство.

С уважением, Ranjan

Ответы [ 2 ]

1 голос
/ 15 февраля 2011

одна из очевидных проблем заключается в том, что drawRect может вызываться регулярно и может только потребовать, чтобы вы нарисовали часть прямоугольника представления.

в вашей реализации вы:

  • чтение pdf с диска. это занимает много времени, тем более что drawRect может вызываться с высокой частотой.

  • прочитайте pdf. это займет некоторое время - его можно избежать во время drawRect.

  • нарисуйте одну страницу. нарисуйте только то, что нужно нарисовать, где это возможно.

  • утилизируйте файл pdf. вы должны держаться за документ pdf, пока вид PDF отображается, а не читать его с диска каждый раз, когда вам нужно нарисовать. *

1 голос
/ 15 февраля 2011
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...