dbr*_*dbr 3 cocoa drawing text
我想要绘制NSAttributedString
一个自定义视图并将其垂直居中,无论字体,大小等等.字符串只是1-99之间的一个小数字.
到目前为止,我已经尝试调用该[NSAttributedString size]
方法以允许我确定绘制的字符串的高度.计划是在使用drawInRect:
或绘制它时使用高度数字使字符串居中drawAtPoint:
.我遇到的问题是,size方法返回的高度大于绘制的字形.做了一些实验后,似乎size:
方法返回的属性,包括伸等最高可能字型的高度,而不是我的NSAttributedString特定字型的高度.
更新:
正如Joshua Nozzi在他的回答中提到的,我可以理解最大高度是你想要用于垂直居中的高度,因为这会阻止你的文字在字符串改变时垂直跳跃.但是,在我的情况下,我想在视觉上将一个数字(例如"10")居中,通常在一个圆圈内.这是我在关注时所关心的"10"线的实际高度.
如何获得与绘制的实际字形紧密绑定的边界框?我想我可能会在某处使用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的绘图矩形:然后将该矩形置于任何目标矩形内.
我希望这是明确和有益的.你的问题中没有足够的细节来获得更具体的信息(即,如果你允许包装,你知道宽度而不是高度等,你要集中在哪里).
以上都不是
根据你的评论和更新,我认为你可以使用 - [NSBezierPath appendBezierPathWithGlyph:inFont]获取单个字形的路径,然后 - [NSBezierPath bounds] .size来获取其居中的大小.这应该只给你从单个字形中实际绘制的内容.