仿射变换后获取真实帧
问题描述:
目标是在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黄色填充?
答
正如Matt所说,除非转换是标识转换,否则视图/图层的框架属性无效。
如果要使用转换来转换某个矩形,那么CGRect结构就没有用了,因为CGRect指定了原点和大小,并且假设矩形的其他3个点从起源。
为了创建一个转换后的矩形,需要为未转换的框架矩形的左上角,右上角,左下角和右下角点构建4个点,然后将转换应用于这些点,之前将变换应用于视图。
请参见功能CGPoint CGPointApplyAffineTransform(CGPoint point, CGAffineTransform t)
将CGAffineTransform
应用于点。
一旦你完成了,你可以使用变换后的点来建立一个包含一个多边形的bezier路径,该多边形是你的变换矩形。 (它可能是也可能不是变形后的矩形,唯一可以肯定的表示它的方式是描述四边形的4点。)
答
请使用bounds
属性。创建自定义布局时,您还必须使用bounds
。它是免费的。
frame
它是矩形,它定义了视图在其上层坐标系中的大小和位置。 bounds
它的矩形定义了图层在其自身坐标系中的大小和位置。
https://developer.apple.com/reference/quartzcore/calayer/1410915-bounds
frame'的'整体概念是没有意义的,除非变换是身份。 Docs对此很清楚。 – matt
那么有没有办法做到这一点?对? –
我不知道“那样做”是什么意思。我不知道你想做什么,你甚至没有解释过什么!但是你的_question_是关于'frame'的,而'frame'是一个纯粹构造的概念,在变换下是没有意义的。 – matt