UILabel截断自定义字体。如何根据所选的自定义字体动态调整UILabel高度?

16

当我在UILabel中显示一些自定义字体时,它们被裁剪了。我有多个自定义字体需要正确显示。如何解决这个问题?

3个回答

22

如上所述,我遇到了一个很烦人的问题,即在UILabel中使用自定义字体时,由于某些原因导致字体被截断。后来我发现这是由于字体特性中的升高和下降

经过长时间搜索,我找到了解决方案,需要您下载一个程序,使用终端调整字体的升高和下降,然后在应用程序上进行测试,直到达到完美。

如果只需要针对一两个字体这样做还好,但如果有20个以上的字体,那就太麻烦了。所以我决定深入研究并查看是否可以访问字体的升高和下降值。结果UIFont恰好具有这些属性!

有了这些信息,我就能够子类化UILabel并通过添加升高和下降值(请使用绝对值,因为它是负数)来动态调整其框架大小。

以下是实现代码的片段,最后一行是精华:

UIFont *font = [UIFont fontWithName:nameOfFontUsed size:44.0];
NSDictionary *attrsDict = [NSDictionary dictionaryWithObject:font forKey:NSFontAttributeName];
NSMutableAttributedString *theString = [[NSMutableAttributedString alloc] initWithString:[NSString stringWithFormat:@"%@", enteredString] attributes:attrsDict];

//Add other attributes you desire

NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
paragraphStyle.lineBreakMode = NSLineBreakByCharWrapping;
paragraphStyle.lineHeightMultiple = 5.0;
[theString addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0, [theString length])];

[self setAttributedText:theString];

[self sizeToFit];

[self setFrame:CGRectMake(self.frame.origin.x, self.frame.origin.y, self.frame.size.width, self.frame.size.height+font.ascender+ABS(font.descender))];

2
我理解你对UILabel进行了子类化。你覆盖了哪个方法并将上述代码放在其中? - mixtly87

11

尝试重写UILabel的intrinsicContentSize属性。

我认为这并不是最佳实践,但在某些情况下可以轻松解决问题。

Swift 3示例:

class ExpandedLabel: UILabel {

  override var intrinsicContentSize: CGSize {

    let size = super.intrinsicContentSize

    // you can change 'addedHeight' into any value you want.
    let addedHeight = font.pointSize * 0.3

    return CGSize(width: size.width, height: size.height + addedHeight)
  }
}

1
作为替代方案,我添加了 font.ascender 而不是添加 font.pointSize 的一部分。 - idrougge
这个解决方案仅适用于使用自动布局的UILabel。 - gogoqaz
这正是我需要的,以避免在 TableView 中 StackView 中具有特殊字符“È”的标签被截断。我使用了 return CGSize(width: size.width, height: size.height + font.ascender) - elp

0
将此属性添加到我的属性文本中(大小为140,最大行高为170),这对我有所帮助:
NSAttributedString.Key.baselineOffset: -100

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接