cocoa – NSString boundingRectWithSize略微低估了正确的宽度 – 为什么?

cocoa – NSString boundingRectWithSize略微低估了正确的宽度 – 为什么?,第1张

概述我正在创建一个显示带有一些文本的窗口的类,一个“不再显示”复选框和一个按钮.为了可重用,类会根据需要调整窗口大小以适合文本. 但是,计算中有一些细微的不精确 – 如果我不向宽度添加5个像素,则某些字符串会被截断. (简单地删除了最后一个字.) 这就是我所拥有的: // NSTextField *textLabel;// NSString *text;NSDictionary *stringAt 我正在创建一个显示带有一些文本的窗口的类,一个“不再显示”复选框和一个按钮.为了可重用,类会根据需要调整窗口大小以适合文本.

但是,计算中有一些细微的不精确 – 如果我不向宽度添加5个像素,则某些字符串会被截断. (简单地删除了最后一个字.)

这就是我所拥有的:

// NSTextFIEld *textLabel;// Nsstring *text;NSDictionary *stringAttributes = [NSDictionary dictionaryWithObject: [textLabel Font] forKey: NSFontAttributename];NSRect textFrame = [text boundingRectWithSize:NSMakeSize(textLabel.frame.size.wIDth,(unsigned int)-1)                                      options:(NsstringDrawingdisableScreenFontSubstitution | NsstringDrawingUseslineFragmentOrigin | NsstringDrawingUsesFontLeading)                                   attributes:stringAttributes];textFrame.size.wIDth += 5;

我暂时将标签的背景颜色设置为黄色以使调试更容易,并且它显然扩展到几乎适合最后一个单词.该测试字符串上有4个像素的额外值.
请注意,没有添加这些像素,并非所有字符串都会失败

我关心的原因有两个:
1)我想知道为什么它有些错误,更重要的是
2)我正在计算通过在计算之后改变宽度,理论上包装可以改变并且不使用最后一行,在文本下面创建额外的空白空间.

@R_404_6120@ 在过去的几年里,我经历了几次同样的问题,每当我需要使用这种方法时都遇到它.我从来没有找到任何有关此事的信息,但多年来我收集到的问题似乎是字符串越短,宽度变得越不准确.在足够长的时间之后,他们使用的等式几乎是完美的,但在此之前,这是非常糟糕的.为什么会这样,我从来没有找到解释.

在我尝试解决这个问题时,我尝试添加平值并乘以常数,但那些从未给出完美的结果.

最近,我一直在使用

wIDth *= (25/(wIDth+2)+1);

使用NsstringDrawingUsesDeviceMetrics.对于我常用的长度,这给了我不错的结果.我已经看到8到50个字符之间的字符串最多有1-2个像素差异,这对我的要求来说足够准确.在50个字符之后,boundingRectWithSize:options:attributes:更准确但不完美.我没有进行过足够广泛的测试来说明这一点.也就是说,这可以消除任何担心下面有另一条线,因为文本永远不会掉到另一条线上.在较高的范围内(未测试过300个字符),它会略微高估而不是低估.在它再次开始低估的情况下,将25增加到~30.

总结

以上是内存溢出为你收集整理的cocoa – NSString boundingRectWithSize略微低估了正确的宽度 – 为什么?全部内容,希望文章能够帮你解决cocoa – NSString boundingRectWithSize略微低估了正确的宽度 – 为什么?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1022922.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存