2016-12-25 6 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). Как я могу получить реальный кадр из прямоугольника, который заполнен желтым?

+1

Вся концепция 'frame' не имеет смысла, если не преобразование личности. Документы вполне понятны. – matt

+0

Итак, нет способа сделать это? Правильно? –

+0

Я не знаю, что означает «сделать это». Я не знаю, что вы думаете, что вы пытаетесь сделать; вы даже не объяснили, что есть! Но ваш _question_ - это 'frame', а' frame' - чисто построенное понятие, которое не имеет смысла при преобразовании. – matt

ответ

1

Как утверждает Мэтт, свойство кадр вида/слоя недействительно, если преобразование не является преобразованием идентичности.

Если вы хотите преобразовать какой-либо прямоугольник с помощью преобразования, структура CGRect не полезна, так как CGRect указывает начало и размер и предполагает, что остальные 3 точки прямоугольника смещены вправо/вниз от происхождение.

Для создания преобразованного прямоугольника вам нужно построить 4 очка в левом верхнем углу, справа вверху, внизу слева, а нижний правый точек нетрансформированных кадра прямоугольника, а затем применить преобразование к этим точкам, перед тем применяя преобразование к виду.

См. Функцию CGPoint CGPointApplyAffineTransform(CGPoint point, CGAffineTransform t), чтобы применить CGAffineTransform к точке.

Как только вы это сделали, вы можете использовать преобразованные точки для построения пути безье, содержащего многоугольник, который является вашим преобразованным прямоугольником. (Это может быть или не быть прямоугольником после трансформации, и единственный надежный способ его представления равен 4 баллам, которые описывают квадратуру.)

0

Используйте bounds. Также вы должны использовать bounds при создании пользовательского макета. Это трансформируется бесплатно.

frame это прямоугольник, который определяет размер и положение вида в его системе координат суперслоя. bounds Это прямоугольник определяет размер и положение слоя в самой себе системе координат.

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

Смежные вопросы