Contex Drawing + Pagination

Sam*_*hah 54 pdf iphone cgcontext quartz-2d ios

我试图将内容绘制scrollview到一个PDF上下文中,我正面临着问题pagination.

以下代码我使用过:

- (void)renderTheView:(UIView *)view inPDFContext:(CGContextRef)pdfContext
{
    // Creating frame.
    CGFloat heightOfPdf = [[[self attributes] objectForKey:SRCPdfHeight] floatValue];
    CGFloat widthOfPdf  = [[[self attributes] objectForKey:SRCPdfWidth] floatValue];
    CGRect pdfFrame = CGRectMake(0, 0, widthOfPdf, heightOfPdf);   
    CGRect viewFrame = [view frame];

    if ([view isKindOfClass:[UIScrollView class]])
    {
        viewFrame.size.height = ((UIScrollView *)view).contentSize.height;
        [view setFrame:viewFrame];
    }
    // Calculates number of pages.
    NSUInteger totalNumberOfPages = ceil(viewFrame.size.height/heightOfPdf);

    // Start rendering.
    for (NSUInteger pageNumber = 0; pageNumber<totalNumberOfPages; pageNumber++)
    {
       // Starts our first page.
       CGContextBeginPage (pdfContext, &pdfFrame);  
       // Turn PDF upsidedown
       CGAffineTransform transform = CGAffineTransformIdentity;
       transform = CGAffineTransformMakeTranslation(0,view.bounds.size.height);
       transform = CGAffineTransformScale(transform, 1.0, -1.0);
       CGContextConcatCTM(pdfContext, transform);

       // Calculate amount of y to be displace.
       CGFloat ty = (heightOfPdf*(pageNumber));

       CGContextTranslateCTM(pdfContext,0,-ty);
       [view.layer renderInContext:pdfContext];

       // We are done drawing to this page, let's end it.
       CGContextEndPage (pdfContext);
   }    
}
Run Code Online (Sandbox Code Playgroud)

它会创建所需数量的页面,但会错误地放置内容.下图解释了它.在此输入图像描述

我的代码有什么问题吗?

zer*_*mpl 1

我认为您不需要将 PDF 翻转的代码。我之前已经这样做过(手动分页,但没有滚动视图)并且从未需要垂直翻转上下文。我主要担心的是,您在每次迭代中都执行此操作 - 如果您有充分的理由翻转它,则您可能不需要在循环中使用它,而只需在循环开始之前执行一次。此外,代码CGContextTranslateCTM(pdfContext,0,-ty);可能需要替换为CGContextTranslateCTM(pdfContext,0,heightOfPdf);

如果这不起作用,请尝试UIGraphicsBeginPDFPage();代替CGContextBeginPage(),这是您的代码和我的代码之间唯一的主要区别。