Cocoa 如何正确使用“绘制文本”;核心文本“;在翻转视图中

Cocoa 如何正确使用“绘制文本”;核心文本“;在翻转视图中,cocoa,core-text,Cocoa,Core Text,我使用自己的NSView与 - (BOOL) isFlipped { return TRUE; } 以左上角为基础的坐标。 问题是我用核心文本绘制文本: CTFontRef font = CTFontCreateWithFontDescriptor(descriptor, size, NULL); CFAttributedStringRef attrStr = makeAttrStringRef(str, font); CTLineRef line = CTLineCreateWithAttr

我使用自己的NSView与

- (BOOL) isFlipped { return TRUE; }
以左上角为基础的坐标。 问题是我用核心文本绘制文本:

CTFontRef font = CTFontCreateWithFontDescriptor(descriptor, size, NULL);
CFAttributedStringRef attrStr = makeAttrStringRef(str, font);
CTLineRef line = CTLineCreateWithAttributedString(attrStr);
CGContextSetTextPosition(context, pos.x, pos.y); // pos is left-top corener
CTLineDraw(line, context);
文本被翻转:

如果我将翻转后的矩阵传递给
CTFontCreateWithFontDescriptor

CGAffineTransform flipped = (CGAffineTransform){1,0,0,-1,0,0};
文本被移动(如果文本的左上角不在
位置
):


在翻转的NSView中绘制文本时,保持左上角坐标的正确方法是什么?

在渲染文本之前,始终必须初始化文本矩阵,通常为标识:

CGContextSetTextMatrix(context, CGAffineTransformIdentity);

已经有一段时间了,所以我记不起是否需要在macOS上翻转它以获得翻转视图。(如果您有问题,请添加注释,我会找到正确的转换。)

Thx。我已经试过你的建议了。设置
CGContextSetTextMatrix
看起来完全等于传递相同的变换矩阵
CTFontCreateWithFontDescriptor
。所以问题是:如果传递的矩阵被翻转,那么文本的左上角就不在
pos
(左下角在
pos
)。啊,现在我更好地看到了问题。否,文本将始终锚定在左下角附近。这就是文本布局系统的工作原理。你必须编写算法来处理这个问题,因为字符的高度不同。@RobNapier-我很难在MacOS上正确绘制核心文本。在我的测试应用程序中,它工作正常,但在滚动视图中,它显示为上下颠倒,字符相互重叠。如果我使用身份矩阵初始化,文本会在某个地方消失!很高兴发布一个新问题是必要的。@DuncanGroenewald我会提出一个新问题,但一定不要颠倒上下文。如果您使用的是来自iOS的代码,它通常会翻转上下文,但macOS通常不应该这样做。如果标识矩阵使文本消失,它可能会在视图之外结束。@RobNapier-谢谢。似乎我只是幸运地得到了我的原型,出于某种原因,CTFrame在没有设置textMatrix的情况下正确绘制。我最终通过绘制边界框和跟踪上升的文本找到了答案——就像你提到的那样——最终绘制的非常小以至于看不见!不过,我们似乎无法为文本框创建cgPath,然后再缩放/旋转它并绘制它-我必须在每次绘制操作中重新创建框架-这似乎效率低下。无论如何,谢谢你。