我想知道屏幕上显示的NSString的宽度(以像素为单位)。所以我可以使NSTextField的边界恰好是字符串本身的长度。所以我使用了IB的“标签”NSTextField,对于那些不知道我的意思的人,我得到了一个标题为“Label”的标签,字体“Lucida Grande 13px”,不可选择,不可编辑,常规尺寸,无背景和根据IB的宽度为38px宽。
如果我想以编程方式获取其宽度,请使用
[@"Label" sizeWithAttributes: [NSDictionary dictionaryWithObject: [NSFont fontWithName: @"Lucida Grande" size: 13] forKey: NSFontAttributeName]].width
哪个会给我33.293457。所以这大约是实际宽度的5 px。
答案 0 :(得分:7)
我相信你注意到的是控件框架和它的布局框架之间的区别。有关详细说明,请参阅Frame vs Layout Frame。
你在计算宽度时做的正确。对于Label,控件的顶部或底部没有额外的填充,这就是为什么您没有看到控件高度的问题。但是,在控件的左侧和右侧,还有三个像素。这可以通过查看IB中的Label控件的框架和布局来验证。
所以,你注意到的~5个像素实际上是6个。一旦考虑到这个填充,你应该没有进一步的麻烦。
不幸的是,没有API来确定各种控件的填充内容(Push Buttons每侧额外增加6个像素)。我建议在http://bugreport.apple.com提交一份错误报告 - Apple确实根据他们提供的API提供了一些API。虽然IB会告诉你,你需要自己编写这些值。如果他们在下一个操作系统版本中发生更改,则需要更新您的应用程序。
答案 1 :(得分:0)
这实际上听起来很合理。你正在比较两种不同的宽度;原始字符串的宽度与NSTextField中包含的字符串的宽度。包含的字符串可能在两端都有一点点填充,以及其他微小的差异。