Como descobrir o tamanho da fonte de um UILabel quando -adjustsFontSizeToFitWidth está definido como YES?

Quando myLabel.adjustsFontSizeToFitWidth = YES , o UILabel ajustará o tamanho da fonte automaticamente caso o texto seja muito longo para o label. Por exemplo, se minha etiqueta tiver apenas 100 pixels de largura e meu texto for muito longo para se ajustar ao tamanho da fonte atual, ele diminuirá o tamanho da fonte até que o texto caiba na etiqueta.

Eu preciso obter o tamanho da fonte real exibido de UILabel quando o tamanho da fonte foi reduzido. Por exemplo, digamos que o tamanho da minha fonte fosse 20, mas a UILabel tinha que reduzi-la a 10. Quando pedi à UILabel a fonte e o tamanho da fonte, obtive meu tamanho de fonte antigo (20), mas não o exibido (10).

Não tenho certeza se isso é totalmente preciso, mas deve ser bem próximo, espero. Pode não levar em conta strings truncadas, ou a altura do label, mas isso é algo que você pode fazer manualmente.

O método

– (CGSize) sizeWithFont: (UIFont *) fonte minFontSize: (CGFloat) minFontSize actualFontSize: (CGFloat *) realFontSize forWidth: (CGFloat) largura lineBreakMode: (UILineBreakMode) lineBreakMode

retornará o tamanho do texto e observará que também possui um parâmetro de referência para o tamanho real da fonte usado.

No caso de alguém ainda precisar da resposta. No iOS9, você pode usar boundingRectWithSize:options:context: para calcular o tamanho real da fonte. Observe que context.minimumScaleFactor não deve ser 0,0 para dimensionar para funcionar.

 - (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; } 

Para uma linha UILabel funciona bem esta solução simples:

 //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; 

Swift 3

 override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() func adjustedFontSizeForLabel(_ label: UILabel) -> CGFloat { let text: NSMutableAttributedString = NSMutableAttributedString(attributedString: label.attributedText!) text.setAttributes([NSFontAttributeName: label.font], range: NSMakeRange(0, text.length)) let context: NSStringDrawingContext = NSStringDrawingContext() context.minimumScaleFactor = label.minimumScaleFactor text.boundingRect(with: label.frame.size, options: NSStringDrawingOptions.usesLineFragmentOrigin, context: context) let adjustedFontSize: CGFloat = label.font.pointSize * context.actualScaleFactor return adjustedFontSize } print(adjustedFontSizeForLabel(yourLabel)) }