2011-07-11 11 views
0

編集: PDFページを描画するとき、原点のコンポーネントに2を掛けたようです。私はこれを引き起こしているのですか?CGContextDrawPDFPageが間違った原点にページを描画しています

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

答えて

2

あなたは時に変更する必要があります。ここではThe PDF is drawn with a considerable offset from it's desired origin

は、ページを描画する関連するコードです:あなたが写真で見ることができるように、ページは黄色のビュー上に描かれている必要がありますpageRectの起点を設定します(これはビューの中央に置くと仮定しています)。実際に1つだけオフセットするときは、レイヤのフレームとcontentViewのフレームの両方をオフセットpageRectに設定しています。あなたは私もすぐに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]; 

//... 
} 
+0

{0、0}何らかの理由として、既に定義済みのオフセットを持っているいくつかのPDFファイルがあります。 – Raphael

関連する問題