当-adjustsFontSizeToFitWidth设置为YES时,如何计算UILabel的字体大小?

时间:2010-03-07 15:13:31

标签: iphone cocoa-touch uikit uilabel

myLabel.adjustsFontSizeToFitWidth = YES时,UILabel会自动调整字体大小,以防文本对标签太长。例如,如果我的标签只有100px宽,并且我的文字太长而无法与当前字体大小相符,那么它会缩小字体大小,直到文本符合标签。

当字体缩小时,我需要从UILabel获取实际显示的字体大小。例如,假设我的字体大小实际上是20,但UILabel不得不将其缩小到10.当我向UILabel询问字体和字体大小时,我得到的是旧字体大小(20),但不是显示的字体大小(10)。

5 个答案:

答案 0 :(得分:6)

我不确定这是否完全准确,但它应该非常接近,希望如此。它可能不会考虑截断的字符串或标签的高度,但这可能是您可以手动完成的。

方法

- (CGSize)sizeWithFont:(UIFont *)font minFontSize:(CGFloat)minFontSize actualFontSize:(CGFloat *)actualFontSize forWidth:(CGFloat)width lineBreakMode:(UILineBreakMode)lineBreakMode

将返回文本大小,并注意它还具有所用实际字体大小的引用参数。

答案 1 :(得分:3)

如果有人仍然需要答案。 在iOS9中,您可以使用boundingRectWithSize:options:context:来计算实际字体大小。请注意,context.minimumScaleFactor不应为0.0才能进行缩放。

- (CGFloat)adjustedFontSizeForLabel:(UILabel *)label {
    NSMutableAttributedString *text = [[NSMutableAttributedString alloc] initWithAttributedString:label.attributedText];
    [text setAttributes:@{NSFontAttributeName:label.font} range:NSMakeRange(0, text.length)];

    NSStringDrawingContext *context = [NSStringDrawingContext new];
    context.minimumScaleFactor = label.minimumScaleFactor;
    [text boundingRectWithSize:label.frame.size options:NSStringDrawingUsesLineFragmentOrigin context:context];
    CGFloat adjustedFontSize = label.font.pointSize * context.actualScaleFactor;

    return adjustedFontSize;
}

答案 2 :(得分:0)

对于单行UILabel工作正常这个简单的解决方案:

//myLabel - initial label

UILabel *fullSizeLabel = [UILabel new];
fullSizeLabel.font = myLabel.font;
fullSizeLabel.text = myLabel.text;
[fullSizeLabel sizeToFit];

CGFloat actualFontSize = myLabel.font.pointSize * (myLabel.bounds.size.width / fullSizeLabel.bounds.size.width);

//correct, if new font size bigger than initial
actualFontSize = actualFontSize < myLabel.font.pointSize ? actualFontSize : myLabel.font.pointSize;

答案 3 :(得分:0)

UILabel *txtLabel = [[UILabel alloc] initWithFrame:rectMax];
txtLabel.numberOfLines = 1;
txtLabel.font = self.fontMax;
txtLabel.adjustsFontSizeToFitWidth = YES;
txtLabel.minimumScaleFactor = 0.1;
[txtLabel setText:strMax];

UILabel *fullSizeLabel = [UILabel new];
fullSizeLabel.font = txtLabel.font;
fullSizeLabel.text = txtLabel.text;
fullSizeLabel.numberOfLines = 1;
[fullSizeLabel sizeToFit];

CGFloat actualFontSize = txtLabel.font.pointSize * (txtLabel.bounds.size.width / fullSizeLabel.bounds.size.width);
actualFontSize = actualFontSize < txtLabel.font.pointSize ? actualFontSize : txtLabel.font.pointSize;
// the actual font
self.fontMax = [UIFont fontWithName:self.fontMax.fontName size:actualFontSize];

我的代码很好用,部分来自@Igor

答案 4 :(得分:0)

快捷键5

对于单行UILabel

extension UILabel {

    var actualFontSize: CGFloat {
    //initial label
     let fullSizeLabel = UILabel()
     fullSizeLabel.font = self.font
     fullSizeLabel.text = self.text
     fullSizeLabel.sizeToFit()

     var actualFontSize: CGFloat = self.font.pointSize * (self.bounds.size.width / fullSizeLabel.bounds.size.width);

    //correct, if new font size bigger than initial
     actualFontSize = actualFontSize < self.font.pointSize ? actualFontSize : self.font.pointSize;

     return actualFontSize
    }

}

然后,获取实际的字体大小非常简单:

let currentLabelFontSize = myLabel.actualFontSize