2010-03-13 49 views
5

我想知道屏幕上显示的NSString的宽度(以像素为单位)。所以我可以将NSTextField的边界与字符串本身的长度完全吻合。所以我使用了IB的“标签”NSTextField,对于那些不知道我的意思的人,我得到了标题为“标签”的标签,字体“Lucida Grande 13px”,不可选择,不可编辑,常规尺寸,无背景和根据到IB它的宽度是38px宽。NSString sizeWithAttributes:不准确

如果我想获得它的宽度编程我用

[@"Label" sizeWithAttributes: [NSDictionary dictionaryWithObject: [NSFont fontWithName: @"Lucida Grande" size: 13] forKey: NSFontAttributeName]].width 

哪位能给我33.293457。所以这是真正的宽度的5倍..

回答

0

这实际上听起来是合理的。你正在比较两种不同的宽度;原始字符串的宽度与包含在NSTextField中的字符串的宽度。包含的字符串在任何一端都可能只有一点填充,除了其他细微的差别。

+0

可能是,但高度是正确的,在逗号后面有6位数字......在做了一些测试后,它看起来总是比原来的尺寸小5px ..这就是为什么我怀疑属性有问题我不知道是什么。即使传递正确的颜色,背景样式,段落样式,换行符模式和方向,也会得到相同的结果,大小减少5 px。 – Jef 2010-03-13 19:32:17

7

我相信你注意到的是控件的框架和它的布局框架之间的区别。请参阅Frame vs Layout Frame以获得很好的解释。

您在计算宽度时做的是正确的事情。对于标签,控件的顶部或底部没有额外的填充,这就是为什么您看不到控件高度的问题。但是,在控件的左侧和右侧还有三个像素。这可以通过查看IB中的标签控件的框架和布局来验证。

所以,你注意到的〜5像素实际上恰好是6.一旦你考虑到这个填充,你应该没有更多的麻烦。

不幸的是,没有API来确定各种控件的填充是什么(按钮每边有6个像素)。我建议在http://bugreport.apple.com处提交错误报告 - 苹果公司基于它们提供的API数量来确定其提供的API的一部分。虽然IB会告诉你,但你需要自己编写这些值。如果他们在下一个操作系统版本中更改,则需要更新您的应用程序。