我想知道屏幕上显示的 NSString 的宽度(以像素为单位)。所以我可以让 NSTextField 的边界恰好是字符串本身的长度。所以我使用了 IB 的“Label”NSTextField,对于那些不知道我的意思的人,我得到了一个标题为“Label”、字体为“Lucida Grande 13px”的标签,不可选择,不可编辑,常规大小,没有背景,并且根据对于 IB,其宽度为 38px。
如果我想以编程方式获取它的宽度,我会使用
[@"Label" sizeWithAttributes: [NSDictionary dictionaryWithObject: [NSFont fontWithName: @"Lucida Grande" size: 13] forKey: NSFontAttributeName]].width
这会给我 33.293457 。所以这大约是实际宽度的 5 像素..
最佳答案
我相信您注意到的是控件框架和布局框架之间的区别。参见 Frame vs Layout Frame一个很好的解释。
您在计算宽度方面做的是正确的。对于标签,在控件的顶部或底部没有额外的填充,这就是为什么您没有发现控件高度有问题的原因。但是,在控件的左侧和右侧,还有另外三个像素。这可以通过查看 IB 中标签控件的框架和布局来验证。
因此,您注意到的 ~5 像素实际上恰好是 6。一旦您考虑到此填充,您就不会再遇到麻烦了。
不幸的是,没有 API 可以确定各种控件的填充是什么(按钮每边有额外的 6 个像素)。我建议在 http://bugreport.apple.com 提交错误报告- Apple 确实将他们提供的 API 部分地基于对它们的请求数量。虽然 IB 会告诉您,但您需要自己编写这些值。如果它们在下一个操作系统版本中发生变化,您将需要更新您的应用程序。
关于objective-c - NSString 大小与属性 : Inaccuracy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2439432/