我正在使用CGContext创建包含一些文本标签的PDF文件。因为文本通常是颠倒的,所以我沿x轴翻转并进行翻译:
CGMutablePathRef path = CGPathCreateMutable();
CGPathAddRect(path, NULL, textRect);
// *** ROTATION CODE FROM BELOW IS ADDED HERE ***
// Flip the coordinate system
CGContextTranslateCTM(context, 0, 2 * textRect.origin.y + textRect.size.height);
CGContextScaleCTM(context, 1.0, -1.0);
NSAttributedString *attString = [[NSAttributedString alloc] initWithString:string attributes:attributes];
CTFramesetterRef aframesetter = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)attString);
CTFrameRef frame = CTFramesetterCreateFrame(aframesetter, CFRangeMake(0, [attString length]), path, NULL);
CTFrameDraw(frame, context);
CFRelease(frame);
CFRelease(path);
CFRelease(aframesetter);
这会在如下页面上绘制文字:
现在我希望所有文字标签旋转180°。这就是我的工作:
CGContextTranslateCTM(context, -1 * (textRect.origin.x + textRect.size.width/2), -1 * (textRect.origin.y + textRect.size.height/2));
CGContextRotateCTM(context, M_PI);
CGContextTranslateCTM(context, (textRect.origin.x + textRect.size.width/2), (textRect.origin.y + textRect.size.height/2));
但这会将标签移出页面:
当我将旋转角度减小到PI / 16或PI / 8时,会产生此输出(标签被填充为红色):
这里有什么问题?
答案 0 :(得分:0)
在第一步中,您将坐标的原点移动到视图下方的某个点,可能不是因为因子2而在您预期的位置。
CGContextTranslateCTM(context, 0, 2 * textRect.origin.y + textRect.size.height);
我希望这应该是从左上边缘到左下边缘的移动原点(看起来不像,但我不能从你的代码中说出来)
然后你水平翻转它,看起来你看到了你的期望,但我希望它太远了(再次这可能是因为textRect不是我期望的那样)
接下来,您将原点移动到视图左侧的一个点,视图的大小的一半+它的位置,再向上移动到某个点,这可能是上方视图高度的一半(如果我第一次翻译右侧) 这可能不是你想要的 - 我希望你希望它在视图的中间,可能(或可能不是)由
完成CGContextTranslateCTM(context, textRect.size.width/2, -textRect.size.height/2);
我希望你仍然处于相同的环境中。
现在你旋转哪个应该没问题并通过调整原点来完成,这与之前的问题相同...