CGContextDrawPDFPage正在错误的原点上绘制页面

时间:2011-07-11 20:25:54

标签: iphone objective-c cocoa-touch ipad cgcontext

编辑:在绘制PDF页面时,似乎原点的组件已乘以2。我正在做的事情是什么造成的?

我有一个UIViewController,它在UIScrollView上显示一个PDF页面。 PDF页面本身是在CATiledLayer上绘制的,但是,当我的视图控制器绘制图层时,图层的边界与绘制的PDF之间存在相当大的偏移。如图所示,页面应该在黄色视图上绘制:

The PDF is drawn with a considerable offset from it's desired origin

以下是绘制页面的相关代码:

- (void)refreshPage
{

    if(contentView) {
        for(UIView *v in self.view.subviews) {
            [v removeFromSuperview];
            [v release];
        }
    }

    CGRect pageRect = CGRectIntegral(CGPDFPageGetBoxRect(self._document.page, kCGPDFCropBox));

    pageRect.origin.x = ((self.view.frame.size.width / 2) - (pageRect.size.width / 2));

    CATiledLayer *tiledLayer = [CATiledLayer layer];
    tiledLayer.delegate = self;
    tiledLayer.tileSize = CGSizeMake(1024.0, 1024.0);
    tiledLayer.levelsOfDetail = 1000;
    tiledLayer.levelsOfDetailBias = 1000;
    tiledLayer.frame = pageRect;

    contentView = [[UIView alloc] initWithFrame:pageRect];
    [contentView.layer addSublayer:tiledLayer];

    CGRect viewFrame = self.view.frame;
    viewFrame.origin = CGPointZero;

    UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:viewFrame];

    //[scrollView setBackgroundColor:[UIColor cyanColor]];
    //[contentView setBackgroundColor:[UIColor yellowColor]];

    scrollView.delegate = self;
    scrollView.contentSize = pageRect.size;
    scrollView.maximumZoomScale = 1000;
    [scrollView addSubview:contentView];

    [self.view addSubview:scrollView];   

    pagingViewController = [[PDFPagingViewController alloc] initWithDocument:self._document AndObserver:self];
    [self.view addSubview:pagingViewController.view];
}

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
{
    return contentView;
}

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx
{
    if(self._document) {
        [layer setBackgroundColor:(CGColorRef)[UIColor redColor]];

        CGRect drawingRect = CGContextGetClipBoundingBox(ctx);

        CGContextSetRGBFillColor(ctx, 1.0, 1.0, 1.0, 1.0);
        CGContextFillRect(ctx, drawingRect);
        CGContextTranslateCTM(ctx, 0.0, layer.bounds.size.height);
        CGContextScaleCTM(ctx, 1.0, -1.0);
        CGContextConcatCTM(ctx, CGPDFPageGetDrawingTransform(self._document.page, kCGPDFCropBox, layer.bounds, 0, true));
        CGContextDrawPDFPage(ctx, self._document.page);
    }
}

1 个答案:

答案 0 :(得分:2)

您需要在设置pageRect的原点时更改(我假设您在视图中居中)。当你真的打算只偏移一个时,你将图层的框架和contentView的框架都设置为偏移pageRect

-(void)refreshPage {
//...

CGRect pageRect = CGRectIntegral(CGPDFPageGetBoxRect(self._document.page, kCGPDFCropBox));

CATiledLayer *tiledLayer = [CATiledLayer layer];
//...
tiledLayer.frame = pageRect;

// set the pageRect origin now to center the contentView, not the layer
pageRect.origin.x = ((self.view.frame.size.width / 2) - (pageRect.size.width / 2));

contentView = [[UIView alloc] initWithFrame:pageRect];
[contentView.layer addSublayer:tiledLayer];

//...
}