作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
目标是在 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)。如何从填充为黄色的矩形中获取真实的框架?
最佳答案
正如 Matt 所说,除非变换是恒等变换,否则 View /层的框架属性是无效的。
如果你想使用变换来变换一些矩形,那么 CGRect 结构就没有用了,因为 CGRect 指定了原点和大小,并假定矩形的其他 3 个点从原点向右/向下移动.
为了创建一个变换的矩形,您需要为未变换的框架矩形的左上角、右上角、左下角和右下角构建 4 个点,然后对这些点应用变换,之前 将转换应用于 View 。
请参阅函数 CGPoint CGPointApplyAffineTransform(CGPoint point, CGAffineTransform t)
将 CGAffineTransform
应用于一个点。
完成后,您可以使用变换后的点来构建包含多边形的贝塞尔曲线路径,该多边形是变换后的矩形。 (变换后可能是也可能不是矩形,唯一可靠的表示方法是用 4 个点来描述一个四边形。)
关于ios - 仿射变换后得到真实帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41322346/
我是一名优秀的程序员,十分优秀!