2016-12-25 14 views
1

目的は、検索された文字列を識別するためにpdfページの実際のフレームを取得することです。コアの方法は次である:層のアフィン変換後に実際のフレームを取得する

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx 
{ 
    CGContextSetFillColorWithColor(ctx, [[UIColor whiteColor] CGColor]); 
    CGContextFillRect(ctx, layer.bounds); 

    // Flip the coordinate system 
    CGContextTranslateCTM(ctx, 0.0, layer.bounds.size.height); 
    CGContextScaleCTM(ctx, 1.0, -1.0); 

    // Transform coordinate system to match PDF 
    NSInteger rotationAngle = CGPDFPageGetRotationAngle(pdfPage); 
    CGAffineTransform transform = CGPDFPageGetDrawingTransform(pdfPage, kCGPDFCropBox, layer.bounds, -rotationAngle, YES); 
    CGContextConcatCTM(ctx, transform); 

    CGContextDrawPDFPage(ctx, pdfPage); 

    if (self.keyword) 
    { 
     CGContextSetFillColorWithColor(ctx, [[UIColor yellowColor] CGColor]); 
     CGContextSetBlendMode(ctx, kCGBlendModeMultiply); 
     for (Selection *s in self.selections) 
     { 
      NSLog(@"layer.bounds = %f, %f, %f, %f", layer.bounds.origin.x, layer.bounds.origin.y, layer.bounds.size.width, layer.bounds.size.height); 
      CGContextSaveGState(ctx); 
      CGContextConcatCTM(ctx, s.transform); 
      NSLog(@"s.frame = %f, %f, %f, %f", s.frame.origin.x, s.frame.origin.y, s.frame.size.width, s.frame.size.height); 
      CGContextFillRect(ctx, s.frame); 
      CGContextRestoreGState(ctx); 
     } 
    } 
} 

サイズ(612.000000、792.000000)であるが、s.frameのサイズは(3.110400、1.107000)です。どのようにして黄色で塗られたrectから実際のフレームを得ることができますか?

+1

変換がアイデンティティでない限り、「フレーム」という概念は無意味です。ドキュメントについては、これについてはかなり明確です。 – matt

+0

そうする方法はありませんか?右? –

+0

"それは何を意味するのか"は分かりません。私はあなたが何をしようとしていると思いますか分かりません。あなたは 's'が何であるかを説明していません!しかし、あなたの_question_は 'frame'についてのものであり、' frame'は純粋に構築された概念であり、変換のもとでは意味がありません。 – matt

答えて

1

Mattが言っているように、変換が恒等変換でない限り、ビュー/レイヤーのフレームプロパティは無効です。

変換を使用していくつかの矩形を変換する場合、CGRect構造体は有用ではありません。これは、CGRectが原点とサイズを指定し、rectの他の3つの点が原点。

変換矩形を作成するには、変換されていないフレーム矩形の左上、右上、左下、右下の点に4点を作成し、これらの点に変換を適用する必要があります。ビューに変換を適用します。

ポイントCGAffineTransformを適用するには、機能CGPoint CGPointApplyAffineTransform(CGPoint point, CGAffineTransform t)を参照してください。

変換ポイントを使用して、変換された矩形であるポリゴンを含むベジェパスを構築することができます。 (変換後は四角形であってもなくてもかまいませんが、それを表す唯一の確実な方法は四辺形を表す4つの点です)

0

boundsを使用してください。また、カスタムレイアウトを作成するときにboundsを使用する必要があります。それは無料です。

frameスーパーレイヤの座標系でのビューのサイズと位置を定義する長方形です。 boundsその矩形は、レイヤ自体の座標系におけるレイヤのサイズと位置を定義します。

https://developer.apple.com/reference/quartzcore/calayer/1410915-bounds

関連する問題