objective-c - NSString 大小与属性 : Inaccuracy

标签 objective-c attributes nsstring

我想知道屏幕上显示的 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/

相关文章:

iOS Google 登录不允许用户代理

ios - 当前 View Controller 未显示

javascript - 如何删除多个子元素的属性?

c# - 在 C# 中使用属性/接口(interface)的区别

ios - 如何将 UIPickerView 的值保存为字符串?

objective-c - 为什么 va_arg 返回地址 0,然后是 1,然后是 2?

iOS:添加数组以创建动态单元格

Ruby:如何即时创建 attr_accessor

ios - NSString 中出现奇怪的竖线字符

objective-c - 我可以在使用 [NSString stringWithFormat :]? 后释放 C 字符串吗?