2016-12-25 15 views
1

목표는 검색된 문자열을 식별하기 위해 PDF 페이지에서 실제 프레임을 얻는 것입니다. 검색된 텍스트를 강조 표시하고 강조 표시된 텍스트 프레임을 가져 오는 방법을 파악하기 위해 PDFKitten lib를 사용하고 있습니다. 층어파인 변환 후 실제 프레임 가져 오기

- (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

매트가 말한 것처럼, 변환이 신원 변환이 아닌 한 뷰/레이어의 프레임 속성은 유효하지 않습니다.

변환을 사용하여 일부 직사각형을 변환하려는 경우 CGRect 구조는 유용하지 않습니다. CGRect는 원점과 크기를 지정하고 rect의 다른 3 개 점이 유래. 당신이 그 점에 변환을 왼쪽, 오른쪽, 왼쪽, 및 변환되지 않은 프레임 사각형의 오른쪽 하단 점 4 점을 구축하고 적용 할 필요가 변형 된 사각형을 생성하기 위해

, 전 뷰에 변환을 적용합니다.

포인트를 CGAffineTransform에 적용하려면 CGPoint CGPointApplyAffineTransform(CGPoint point, CGAffineTransform t) 기능을 참조하십시오.

변환 된 점을 사용하여 변형 된 사각형 인 다각형을 포함하는 베 지어 경로를 만들 수 있습니다. (변형 후 직사각형 일 수도 있고 아닐 수도 있습니다. 단 4 각을 설명하는 유일한 4 점으로 나타낼 수 있습니다.

0

bounds 속성을 사용하십시오. 또한 맞춤 레이아웃을 만들 때 bounds을 사용해야합니다. 그것은 자유로운 변형입니다.

frame 슈퍼 레이어의 좌표계에서 뷰의 크기와 위치를 정의하는 사각형입니다. bounds이 사각형은 레이어 자체의 좌표계에서 레이어의 크기와 위치를 정의합니다. 정체성이다 변환하지 않는 한 frame``의

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