【问题标题】:Cutting off UILabel symbols in some fonts because of symbols parameters in fonts由于字体中的符号参数,切断了某些字体中的 UILabel 符号
【发布时间】:2016-05-05 11:35:41
【问题描述】:

我注意到,在某些字体中,如果某些符号的帧大小由 NSAttributedString.size 或 boundingRectWithSize 确定,则它们在 UILabel 中显示不正确。例如,我选择字体 AvenirNext-Bold,符号“A”,并将 pointSize 设置为 300。计算帧(宽度 = 218.69999999999999,高度 = 409.80000000000001)。我把那个字符放在上述大小的框架中。

正如你在图片中看到的,被显示的标签被切断的部分在红色框中突出显示。我检查了其他几种字体,并注意到它一直在发生。我可以摆脱这个而不必更改 UILabel 的框架并更正字体中符号的边距吗?使用第三方程序,我发现对于AvenirNext-Bold字体,对于字符“A”,左右边距等于-1.39。

有人知道解决这个问题的任何技术吗?

补充:

如果您在 MAC 操作系统上打开字体应用程序,并找到 Avenir Next Bold 字体,您会看到此字体被截断。

代码:

NSString *text = @"A";
NSString *fontName = @"AvenirNext-Bold";

CGFloat pointSize = 300.f;

UIFont *font = [UIFont fontWithName:fontName size:pointSize];

CGSize size = [text boundingRectWithSize:CGSizeMake(CGFLOAT_MAX, CGFLOAT_MAX) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:font} context:nil].size;

self.label.text = text;
self.label.font = font;

self.label.frame = CGRectMake((self.view.bounds.size.width - size.width) / 2.f, (self.view.bounds.size.height - size.height) / 2.f, size.width, size.height);

附加字体: 您可以将字体更改为 BodoniSvtyTwoITCTT-BookIta。

【问题讨论】:

  • 你试过'label.clipToBounds = false'
  • 大卫威廉姆斯,是的,我试过了。
  • 请显示重现所需的实际代码。
  • matt,这里是重现的代码。

标签: ios uilabel uifont


【解决方案1】:

我认为您在这里注意到的现象与我注意到 in my book 的现象基本相同,即这些大小计算,例如 boundingRectWithSize:options:context: 和 NSAttributedString 的 size,忽略了边距。

在这种情况下,您可能可以通过提供自己的额外保证金来解决此问题(尽管我不知道如何计算金额,而不是任意计算):

NSString *text = @"A";
NSString *fontName = @"AvenirNext-Bold";
CGFloat pointSize = 300.f;
UIFont *font = [UIFont fontWithName:fontName size:pointSize];
CGFloat margin = 10;

NSMutableAttributedString* s = [[NSMutableAttributedString alloc] initWithString:text];
[s addAttribute:NSFontAttributeName value:font range:NSMakeRange(0,s.length)];
NSMutableParagraphStyle* p = [NSMutableParagraphStyle new];
p.firstLineHeadIndent = margin;
p.tailIndent = -margin; // in case of right alignment
[s addAttribute:NSParagraphStyleAttributeName value:p range:NSMakeRange(0,s.length)];
CGSize size = [s size];

self.label.attributedText = s;
self.label.frame = CGRectMake((self.view.bounds.size.width - size.width) / 2.f, (self.view.bounds.size.height - size.height) / 2.f, size.width+margin*2, size.height);

【讨论】:

  • 感谢 matt 提供的示例,不幸的是,此解决方案不能解决所有问题。如果设置参数 textAlignment = NSTextAlignmentRight;你可以看到符号仍然被剪裁了。
  • 所以不要那样做。我已经告诉过你,边距被忽略了。如果你运行我给你的代码,字形看起来很好。如果您运行其他代码,请不要告诉我这是我的错。
  • 您的代码运行正常。但不幸的是,它并不能解决所有问题。我正在寻找一种对所有字体都通用的解决方案,无论其他参数(textAlignment 和另一个)如何,它都可能包含此类字符问题。
  • 我确定你是。但我没有那个。我在回答中似乎有一个错误。请不要再折磨我了;我只是想帮忙。你提出了一个有趣的问题,但没有灵丹妙药。如果您认为这是一个问题,请向 Apple 提交错误报告。
  • 此外,处理右对齐是微不足道的:只需插入以下行:p.tailIndent = -margin; 您必须在此处完成一些的工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-14
  • 2017-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多