【问题标题】:CGContextDrawPDFPage is drawing the page on the wrong origin pointCGContextDrawPDFPage 在错误的原点上绘制页面
【发布时间】:2011-07-11 20:25:54
【问题描述】:

编辑:在绘制PDF页面时,似乎原点的分量被乘以2。是我正在做的事情造成的吗?

我有一个在 UIScrollView 上显示 PDF 页面的 UIViewController。 PDF 页面本身是在 CATiledLayer 上绘制的,但是,当我的视图控制器绘制图层时,图层边界和绘制的 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);
    }
}

【问题讨论】:

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


    【解决方案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];
    
    //...
    }
    

    【讨论】:

    • 除了按照你说的修复代码之外,我还必须立即将 pageRect 的原点更改为 { 0, 0 },因为某些 PDF 文件已经具有预定义的偏移量。跨度>
    猜你喜欢
    • 2011-03-13
    • 2011-12-30
    • 2015-12-18
    • 1970-01-01
    • 1970-01-01
    • 2019-10-11
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多