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

前端 未结 8 1236
一整个雨季
一整个雨季 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: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];
    }
    

提交回复
热议问题