无论属性如何,我如何将NSAttributedString居中?

时间:2011-11-13 15:46:43

标签: cocoa text drawing

我希望将NSAttributedString绘制到自定义视图并将其垂直居中,无论字体,大小等等。字符串只是1-99之间的一个小数字。

到目前为止,我已尝试调用[NSAttributedString size]方法以允许我确定绘制的字符串的高度。计划是在使用drawInRect:drawAtPoint:绘制字符串时使用高度图将字符串居中。我遇到的问题是,size方法返回的高度大于绘制的字形。在做了一些实验之后,似乎size:方法返回了最高的可能字形的高度,包括下行等等,而不是NSAttributedString中特定字形的高度。

更新

正如Joshua Nozzi在他的回答中提到的,我可以理解最大高度是你想要用于垂直居中的高度,因为这会阻止你的文字在字符串改变时垂直跳跃。但是,在我的情况下,我想在视觉上将一个数字居中,例如“10”,通常在一个圆圈内。这是我在做这件事时所关心的“10”线的实际高度。

如何获得与绘制的实际字形紧密绑定的边界框?我想我可能会在某处使用Core Text和CTLineGetImageBounds()函数;但是,这是很多代码。如果我可以在不使用这种详细/低级代码的情况下做到这一点,那就更好了。

我知道我可能会用上面的方法完全咆哮错误的树。你会建议什么方法?我是否需要直接使用Cocoa Text / Core Text,而不是使用NSAttributedString的添加?

Mac OS中的文本系统功能丰富,对于像我这样的初学者来说有点吓人。非常感谢任何帮助。

1 个答案:

答案 0 :(得分:5)

首先,你肯定想要你所描述的高度行为。想象一下,如果绘制的字符串从使用不需要“额外”高度的字符变为使用字符字符。绘制的字符串将垂直跳转。不好。 绝对使用文本系统为指定字体指定的高度。

要回答您的主要问题,drawInRect:将根据段落属性换行提供的矩形的宽度。如果您根本不想担心包装,最好使用-drawAtPoint:并手动计算中心。垂直中心是建议矩形的高度的一半,在该矩形中,你的中心减去属性字符串的-size(或常规字符串的-sizeWithAttributes :)高度的一半。您提供给-drawAtPoint的NSPoint的y坐标:可以使用NSMidY(rect) - ([attrString size].height / 2)计算。

如果你关心包装并且你已经知道可用的宽度,你可以使用NSAttributedString的-boundingRectWithSize:options:。传入的大小应将其宽度设置为可用宽度,将高度设置为零。这告诉您在包装到给定宽度时想要知道所需高度的方法。然后,您可以将返回的矩形用作-drawInRect的绘图矩形:然后将矩形矩形放在任何目标矩形内。

我希望这很清楚,也很有帮助。你的问题中没有足够的细节来获得更具体的信息(例如,如果你允许包装,知道宽度而不是高度等,你将放在中的内容是什么。)

以上都不是

根据您的评论和更新,我认为您可以使用 - [NSBezierPath appendBezierPathWithGlyph:inFont]来获取单个字形的路径,然后使用 - [NSBezierPath bounds] .size来获取其居中的大小。这应该只给你从单个字形中实际绘制的内容。