UILabel 切断了自定义字体。如何根据所选的自定义字体动态调整 UILabel 高度?
UILabel cuts off custom font. How do I dynamically adjust UILabel height based on custom font selected?
我加载到我的应用程序中的一些自定义字体在显示在 UILabel 中时被截断了。我有多种自定义字体需要正确显示。我该如何解决这个问题?
如前所述,我遇到了一个非常烦人的问题,即 UILabel 中的自定义字体会由于某事而被截断。后来发现是因为ascenders and descenders(字体特征)。
经过大量搜索,我发现了一个 solution 要求您下载程序,使用终端调整字体的升序和降序,然后在您的应用程序上进行测试,直到完美为止。
如果我不必为 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))];
尝试覆盖 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)
}
}
将此属性添加到我的属性文本(大小为 140,最大行高为 170)为我修复了它:
NSAttributedString.Key.baselineOffset: -100
我加载到我的应用程序中的一些自定义字体在显示在 UILabel 中时被截断了。我有多种自定义字体需要正确显示。我该如何解决这个问题?
如前所述,我遇到了一个非常烦人的问题,即 UILabel 中的自定义字体会由于某事而被截断。后来发现是因为ascenders and descenders(字体特征)。
经过大量搜索,我发现了一个 solution 要求您下载程序,使用终端调整字体的升序和降序,然后在您的应用程序上进行测试,直到完美为止。
如果我不必为 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))];
尝试覆盖 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)
}
}
将此属性添加到我的属性文本(大小为 140,最大行高为 170)为我修复了它:
NSAttributedString.Key.baselineOffset: -100