CGContextDrawPDFPage рисует страницу в неправильной исходной точке

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

У меня есть UIViewController, который отображает страницу PDF в UIScrollView. сама PDF-страница рисуется на CATiledLayer, однако, когда мой контроллер представления рисует слой, между границами слоя и нарисованным PDF-файлом происходит значительное смещение. Как вы можете видеть на картинке, страница должна была быть нарисована в желтом виде:

PDF-файл нарисован со значительным смещением от желаемого источника

Вот соответствующий код, который рисует страницу:

- (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);
    }
}

person Raphael    schedule 11.07.2011    source источник


Ответы (1)


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

//...
}
person thelaws    schedule 14.07.2011
comment
В дополнение к исправлению кода, как вы сказали, мне также пришлось немедленно изменить происхождение pageRect на {0, 0}, поскольку по какой-то причине есть некоторые файлы PDF, у которых уже есть предопределенное смещение. - person Raphael; 15.07.2011