【问题标题】:How to figure out the font size of a UILabel when -adjustsFontSizeToFitWidth is set to YES?当 -adjustsFontSizeToFitWidth 设置为 YES 时,如何计算 UILabel 的字体大小?
【发布时间】:2011-01-24 16:47:34
【问题描述】:

myLabel.adjustsFontSizeToFitWidth = YES 时,UILabel 会自动调整字体大小,以防文本太长而不是标签。例如,如果我的标签只有 100px 宽,而我的文本太长而无法适应当前的字体大小,它会缩小字体大小,直到文本适合标签为止。

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

【问题讨论】:

  • 这个问题下的所有答案都没有真正回答所提出的问题。不知道为什么会这样,但确实如此。这是给未来读者的实际答案:stackoverflow.com/a/28285447/2057171

标签: iphone cocoa-touch uikit uilabel


【解决方案1】:

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

方法

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

将返回文本大小,并注意它还有一个用于实际使用的字体大小的参考参数。

【讨论】:

  • 这个方法现在在 iOS 7 下被弃用了。见stackoverflow.com/questions/19195541/…
  • 这也将返回给定字体大小的边界框大小...不是给定边界框大小的字体大小。
  • @jowie 它不返回字体大小,但它确实给了你 - 对于 actualFontsize: 你取消引用一个指针并将值放在那里 - actualFontSize:&mySizeCgFloat 像这样
【解决方案2】:

如果有人仍然需要答案。 在 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;
}

【讨论】:

  • 这个方法还是返回原来的字体大小
【解决方案3】:

对于单行 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;

【讨论】:

    【解决方案4】:

    斯威夫特 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
    

    【讨论】:

    • 对于它计算的字体大小,这似乎有点偏离,这对我来说很重要,有什么想法为什么会这样吗?
    【解决方案5】:
    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

    【讨论】:

      猜你喜欢
      • 2016-01-04
      • 2013-10-12
      • 1970-01-01
      • 1970-01-01
      • 2017-05-31
      • 2015-07-15
      • 2012-01-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多