gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 16:18:01 31 4
gpt4 key购买 nike

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

到目前为止,我已经尝试调用 [NSAttributedString size] 方法来确定绘制的字符串的高度。计划是在使用 drawInRect:drawAtPoint: 绘制字符串时,使用高度数字将字符串居中。我遇到的问题是,从 size 方法返回的高度大于绘制的字形。经过一些实验后,似乎 size: 方法返回具有这些属性的最高可能字形的高度,包括下伸部分等,而不是我的 NSAttributedString 中特定字形的高度。

更新:

正如 Joshua Nozzi 在他的回答中提到的,我可以理解最大高度是您想要用于垂直居中的高度,因为这会防止您的文本在字符串更改时垂直跳跃。然而,就我而言,我想在视觉上将数字居中,例如“10”,通常在一个圆圈内。这是我在执行此操作时关心的“10”行的实际高度。

如何获得与绘制的实际字形紧密绑定(bind)的边界框?我想我可能会通过使用 Core Text 和 CTLineGetImageBounds() 函数有所收获;然而,它有很多代码。如果我可以在不使用如此冗长/低级代码的情况下做到这一点,那就更好了。

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

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

最佳答案

首先,您肯定想要您所描述的高度行为。想象一下,如果绘制的字符串从使用不需要“额外”高度的字符更改为使用需要“额外”高度的字符。拉出的绳子会垂直跳跃。不好。 肯定使用文本系统给定字体的高度。

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

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

我希望这是清晰且有帮助的。您的问题中没有足够的细节来变得更具体(即,您以什么为中心,如果您允许换行,知道宽度但不知道高度等)。

以上都不是

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

关于cocoa - 无论属性如何,如何使 NSAttributedString 居中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8112683/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com