How to calculate actual font point size in iOS 7 (not the bounding rectangle)?

前端 未结 8 1194
一整个雨季
一整个雨季 2020-12-01 15:13

Edit: The linked \"duplicate\" question only deals with calculating text rectangle. I need to calculate actual font size after label scaled it, NOT the string size.<

相关标签:
8条回答
  • 2020-12-01 15:39

    Next code doesn't support minFontSize and lineBreakMode so if you need them you should improve it by yourself:

    CGSize NSString_sizeWithFont(NSString * str, UIFont *font) {
        CGSize result;
        if (NO == [str respondsToSelector: @selector(sizeWithAttributes:)]) {
            // legacy way
            result = [str sizeWithFont: font];
        } else {
            // modern way
            NSDictionary * dict = [NSDictionary dictionaryWithObjectsAndKeys:
                                   font, NSFontAttributeName, nil];
            result = [str sizeWithAttributes: dict];
        }
        return result;
    }
    
    UIFont * NSString_calcActualFont(NSString * str, UIFont * initialFont,
                                     CGSize sizeLimit, CGSize * actualSize)
    {
        const CGSize curSize = NSString_sizeWithFont(str, initialFont);
    
        CGFloat actualFontSize = initialFont.pointSize;
        actualFontSize *= MIN(sizeLimit.width / curSize.width, sizeLimit.height / curSize.height);
    
        UIFont * actualFont = [initialFont fontWithSize: floorf(actualFontSize)];
        *actualSize = NSString_sizeWithFont(str, actualFont);
    
        return actualFont;
    }
    
    0 讨论(0)
  • 2020-12-01 15:41

    My specific quest has been to size the font on 2 labels equally with adjustsFontSizeToFitWidth enabled. The solution works on iOS 6 and 7.

    + (void)sizeLabelFontToMinSizeFor:(UILabel *)label1 and:(UILabel *)label2 {
    
    NSStringDrawingContext *labelContext = [NSStringDrawingContext new];
    labelContext.minimumScaleFactor = label1.minimumScaleFactor;
    
    NSAttributedString *attributedString1 = [[NSAttributedString alloc] initWithString:label1.text attributes:@{NSFontAttributeName : label1.font}];
    // the NSStringDrawingUsesLineFragmentOrigin and NSStringDrawingUsesFontLeading options are magic
    [attributedString1 boundingRectWithSize:label1.frame.size options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading context:labelContext];
    
    CGFloat actualFontSize1 = label1.font.pointSize * labelContext.actualScaleFactor;
    
    labelContext = [NSStringDrawingContext new];
    labelContext.minimumScaleFactor = label2.minimumScaleFactor;
    
    NSAttributedString *attributedString2 = [[NSAttributedString alloc] initWithString:label2.text attributes:@{NSFontAttributeName : label2.font}];
    [attributedString2 boundingRectWithSize:label2.frame.size options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading context:labelContext];
    
    CGFloat actualFontSize2 = label2.font.pointSize * labelContext.actualScaleFactor;
    
    CGFloat minSize = MIN(actualFontSize1, actualFontSize2);
    
    label1.font = [UIFont fontWithName:RCDefaultFontName size:minSize];
    label2.font = [UIFont fontWithName:RCDefaultFontName size:minSize];
    }
    
    0 讨论(0)
提交回复
热议问题