如何计算iOS 7中的实际字体点大小(不是边界矩形)?

ope*_*rog 10 iphone objective-c ios ios7

编辑:链接的"重复"问题仅涉及计算文本矩形.我需要在标签缩放后计算实际字体大小,而不是字符串大小.

现在不推荐使用此方法:

size = [self sizeWithFont:font // 20
              minFontSize:minFontSize // 14
           actualFontSize:&actualFontSize // 16
                 forWidth:maxWidth
            lineBreakMode:self.lineBreakMode];
Run Code Online (Sandbox Code Playgroud)

现在在iOS 7中缩小文本大小以适应时,如何计算UILabel的字体大小?

小智 11

我有同样的问题,我需要知道实际的大小,使我的UIView中的其他UILabel匹配.

我知道这不是一个完美的解决方案,但也许它对你有用.

我的解决方案是:而不是使用adjustsFontSizeToFitWidth我计算"手动"的大小.

CGSize initialSize = [_label.text sizeWithAttributes:@{NSFontAttributeName:_label.font}];
while ( initialSize.width > _label.frame.size.width ) {
    [_label setFont:[_label.font fontWithSize:_label.font.pointSize - 1]];
    initialSize = [_label.text sizeWithAttributes:@{NSFontAttributeName:_label.font}];
}
CGFloat actualSize = _label.font.pointSize;
Run Code Online (Sandbox Code Playgroud)


Eri*_*eut 9

从Julius Bahr在本页面上的答案中提取,这种方法非常适合在自动调整后获得实际字体大小:

- (CGFloat)getActualFontSizeForLabel:(UILabel *)label
{
    NSStringDrawingContext *labelContext = [NSStringDrawingContext new];
    labelContext.minimumScaleFactor = label.minimumScaleFactor;

    NSAttributedString *attributedString = [[NSAttributedString alloc] initWithString:label.text attributes:@{ NSFontAttributeName: label.font }];
    [attributedString boundingRectWithSize:label.frame.size
                                   options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading
                                   context:labelContext];

    CGFloat actualFontSize = label.font.pointSize * labelContext.actualScaleFactor;
    return actualFontSize;
}
Run Code Online (Sandbox Code Playgroud)

我在我的应用程序中使用它来获取三个不同标签的字体大小,我需要保持大小同步,同时仍然允许它们自动缩小本地化的翻译,这可能比原来的英语版本长一点.

我为每个标签调用一次该方法,然后如果它们不是全部相同的值,我将标签的字体大小设置为三者中的最小值.


rob*_*off 8

使用的minFontSize是过时的UILabel在iOS 6中,并在NSStringiOS中7图纸添加如果你想使用它,并发现实际使用的字体大小,你需要使用你在你的问题中提到的方法已过时.

替换minFontSizeminimumScaleFactor.如果要查找使用的实际比例因子,则需要创建一个NSStringDrawingContext并在boundingRectWithSize:options:attributes:context:消息中传递它,如下所示:

NSStringDrawingContext *context = [[NSStringDrawingContext alloc] init];
context.minimumScaleFactor = 0.7;
[label.text boundingRectWithSize:CGSizeMake(maxWidth, HUGE_VAL)
    options:NSStringDrawingUsesLineFragmentOrigin
    attributes:@{
        NSFontAttributeName: font
    } context:context];
CGFloat actualFontSize = font.pointSize * context.actualScaleFactor;
Run Code Online (Sandbox Code Playgroud)

  • NSString版本坏了.您需要使用NSAttributedString的等效方法.[` - [NSAttributedString boundingRectWithSize:options:context]`](https://developer.apple.com/library/ios/documentation/uikit/reference/NSAttributedString_UIKit_Additions/Reference/Reference.html#//apple_ref/occ/instm/ NSAttributedString/boundingRectWithSize:选项:上下文:) (5认同)
  • 在7.0.3上,actualFontSize始终相同.它完全被打破了. (2认同)

Dou*_*oss 5

扩展Ferran的答案

要扩展到填充宽度或高度,无论它首先击中

Swift版本

func getFontSizeToFitFrameOfLabel(label: UILabel) -> CGFloat
{
    var initialSize : CGSize = label.text!.sizeWithAttributes([NSFontAttributeName : label.font])

    if initialSize.width > label.frame.size.width ||
       initialSize.height > label.frame.size.height
    {
        while initialSize.width > label.frame.size.width ||
              initialSize.height > label.frame.size.height
        {
            label.font = label.font.fontWithSize(label.font.pointSize - 1)
            initialSize = label.text!.sizeWithAttributes([NSFontAttributeName : label.font])
        }
    } else {
        while initialSize.width < label.frame.size.width &&
              initialSize.height < label.frame.size.height
        {
            label.font = label.font.fontWithSize(label.font.pointSize + 1)
            initialSize = label.text!.sizeWithAttributes([NSFontAttributeName : label.font])
        }
        // went 1 point too large so compensate here
        label.font = label.font.fontWithSize(label.font.pointSize - 1)
    }
    return label.font.pointSize;
}
Run Code Online (Sandbox Code Playgroud)

然后做这样的事情来使用它(说你的标签名为title1Label)

 title1Label.frame = CGRect(x: 0.0, y: 0.0, width: view.frame.size.width, height: view.frame.size.height)
 // sets font to some nonzero size to begin with, it will change up or down to fit the label's frame
 title1Label.font = UIFont(name: "Super Mario 256", size: 45.0)
 title1Label.font = title1Label.font.fontWithSize(getFontSizeToFitFrameOfLabel(title1Label))
 // resize height to be a little larger than the font height
 title1Label.frame.size.height = title1Label.font.pointSize*1.3
Run Code Online (Sandbox Code Playgroud)

Objective C版本:

- (CGFloat) maxFontSize:(UILabel *)label{
   CGSize initialSize = [label.text sizeWithAttributes:@{NSFontAttributeName:label.font}];

   if (initialSize.width > label.frame.size.width ||
       initialSize.height > label.frame.size.height)
   {
       while (initialSize.width > label.frame.size.width ||
              initialSize.height > label.frame.size.height)
       {
           [label setFont:[label.font fontWithSize:label.font.pointSize - 1]];
           initialSize = [label.text sizeWithAttributes:@{NSFontAttributeName:label.font}];
       }
   } else {
       while (initialSize.width < label.frame.size.width &&
              initialSize.height < label.frame.size.height)
       {
           [label setFont:[label.font fontWithSize:label.font.pointSize + 1]];
           initialSize = [label.text sizeWithAttributes:@{NSFontAttributeName:label.font}];
       }
       // went 1 point too large so compensate here
       [label setFont:[label.font fontWithSize:label.font.pointSize - 1]];
   }
   return label.font.pointSize;
}
Run Code Online (Sandbox Code Playgroud)