在仿射变换后获得真实的框架

时间:2016-12-25 15:23:10

标签: ios pdf quartz-graphics cgcontext quartz-2d

目标是在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)。如何从填充黄色的矩形中获取实际帧?

2 个答案:

答案 0 :(得分:2)

正如Matt所说,除非转换是身份转换,否则视图/图层的帧属性无效。

如果你想使用变换转换某个矩形,那么CGRect结构就没用了,因为CGRect指定了一个原点和一个大小,并假设rect的其他3个点是从右移/右移起源。

为了创建变换后的矩形,您需要为未转换的框架矩形的左上角,右上角,左下角和右下角构建4个点,然后将变换应用于这些点之前将变换应用于视图。

请参阅函数CGPoint CGPointApplyAffineTransform(CGPoint point, CGAffineTransform t)以将CGAffineTransform应用于某个点。

完成后,您可以使用变换点构建包含多边形的贝塞尔曲线路径,该多边形是变换后的矩形。 (它可能是也可能不是变换后的矩形,唯一可靠的表示它的方式是描述四边形的4个点。)

答案 1 :(得分:-1)

请使用bounds属性。此外,您必须在创建自定义布局时使用bounds。它是免费的。

frame它的矩形定义了超级层坐标系中视图的大小和位置。 bounds它的矩形定义了图层在其自身坐标系中的大小和位置。

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