如何使NSAttributedString居中,无论其属性如何?

3
我想在自定义视图中绘制一个NSAttributedString并使其垂直居中,无论字体、大小等如何。该字符串只是1-99之间的小数字。
到目前为止,我已经尝试调用[NSAttributedString size]方法来确定绘制字符串的高度。计划使用高度值在使用drawInRect:或drawAtPoint:绘制时居中字符串。我的问题是,从size方法返回的高度大于绘制的字形。经过一些实验后,似乎size:方法返回具有这些属性的最高可能字形(包括下降字符等)的高度,而不是我NSAttributedString中特定字形的高度。
更新:
如Joshua Nozzi在他的答案中提到的那样,我可以理解垂直居中所需使用的最大高度,因为这将防止文本随着字符串的更改而在垂直方向上跳动。但是,在我的情况下,我想要在圆圈内部视觉上居中一个数字,例如“10”。这时,我关心的是行“10”的实际高度。
如何获得与绘制的实际字形紧密绑定的边界框?我认为我可以使用Core Text和CTLineGetImageBounds()函数来实现它;然而,这是很多代码。如果我可以不使用这种冗长/低级别的代码来完成它,那会更好。
我知道我可能完全错了。你有什么建议?我需要直接使用Cocoa Text/Core Text,而不是使用NSAttributedString的附加功能吗?
Mac OS中的文本系统非常丰富,对于像我这样的初学者来说有点令人生畏。非常感谢任何帮助。

啊,你的更新提供了很好的细节。我已经更新了我的答案。 - Joshua Nozzi
1个回答

5
首先,您肯定想要所描述的高度行为。想象一下,如果绘制的字符串从使用不需要那个“额外”高度的字符更改为使用需要该高度的字符。绘制的字符串将在垂直方向上跳动。不好。一定要使用指定字体的文本系统给出的高度。
回答您的主要问题,drawInRect:将根据段落属性自动换行到提供的矩形的宽度。如果您完全不想担心换行,则最好使用-drawAtPoint:并手动计算中心。垂直中心是你要居中的建议矩形的高度的一半减去属性字符串的大小(或常规字符串的-sizeWithAttributes:)的一半。您提供给-drawAtPoint:的NSPoint的y坐标可以使用NSMidY(rect) - ([attrString size].height / 2)来计算。
如果您关心换行,并且已经知道可用宽度,则可以使用NSAttributedString的-boundingRectWithSize:options:。您传递的size应将其宽度设置为可用宽度,将高度设置为零。这告诉方法您想要在给定宽度上换行时所需的高度。然后,您可以使用返回的矩形作为-drawInRect:的绘图矩形,然后在任何目标矩形内居中矩形。
希望这很清楚并且有帮助。您的问题中没有足够的细节以获得更具体的信息(即,您正在将其居中到哪里,如果允许换行,则知道宽度但不知道高度等)。
根据您的评论和更新,我认为您可以使用-[NSBezierPath appendBezierPathWithGlyph:inFont]获取单个字形的路径,然后使用-[NSBezierPath bounds].size获取其大小以进行居中。这应该只给出从单个字形实际绘制的内容。

谢谢Joshua。问题是,如果我使用字形的最大高度而不是我的特定字形的高度,那么我所绘制的可能看起来有点奇怪,因为文本不会像所见的那样垂直居中。例如,在某些情况下,我实际上想在圆圈内绘制一个单个字形(1-5个字符),使其在视觉上居中。在这种情况下,我认为我确实需要我的特定字形的高度,而不是该字体/点大小中最高字形的高度。我听到你关于文本在垂直方向上跳动的观点,但这可能与我的情况无关。 - dbr
啊,这种细节最好在你的原始问题中发布。 :-) 我已更新我的答案。 - Joshua Nozzi
抱歉,乔舒亚,我的问题可能可以更好。我有点新手,所以有时候不知道什么是重要的。谢谢你的提示。如果我从0-9中绘制数字,那似乎会起作用,因为它是单个字形。如果我能找到一种适用于字形行的通用解决方案,那就太好了,因为在某些情况下,我将需要绘制比9更高的数字。 - dbr
这是你花一些时间阅读API参考文档的时候。在我提到的NSBezierPath方法之后,是-appendBezierPathWithGlyphs:count:inFont:,它可以给出多个字形的路径。其余的方法是相同的。 - Joshua Nozzi
我已经接近掌握那个技巧了,尽管边界包含一些让人烦恼的尾随空格。我的核心文本技术有一些前导空格,我很难摆脱它们。我相信再多努力一点,我就能解决这个问题。 - dbr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接