CGContextDrawPDFPage рисует страницу в неправильной исходной точке - PullRequest
0 голосов
/ 12 июля 2011

Редактировать: Кажется, что компоненты исходной точки были умножены на 2 при рисовании страницы PDF.Что-то, что я делаю, вызывает это?

У меня есть UIViewController, который отображает страницу PDF в UIScrollView.Сама страница 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 Ответ

2 голосов
/ 14 июля 2011

Вам нужно изменить, когда вы устанавливаете источник 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];

//...
}
...