Use sizeToFit de UILabel en lugar de sizeWithFont: para diseñar un UILabel de varias líneas, ya que sizeWithFont: truncará la cadena (vea Apple Docs). El siguiente código reduce el tamaño de fuente de una etiqueta hasta que el ajuste de texto en un tamaño especificado ... varias líneas de texto se utilizará tan pronto como se encajan en la altura especificada:
-(void)setFontSizeOfMultiLineLabel: (UILabel*)label
toFitSize: (CGSize) size
forMaxFontSize: (CGFloat) maxFontSize
andMinFontSize: (CGFloat) minFontSize
startCharacterWrapAtSize: (CGFloat)characterWrapSize{
CGRect constraintSize = CGRectMake(0, 0, size.width, 0);
label.frame = constraintSize;
label.lineBreakMode = UILineBreakModeWordWrap;
label.numberOfLines = 0; // allow any number of lines
for (int i = maxFontSize; i > minFontSize; i--) {
if((i < characterWrapSize) && (label.lineBreakMode == UILineBreakModeWordWrap)){
// start over again with lineBreakeMode set to character wrap
i = maxFontSize;
label.lineBreakMode = UILineBreakModeCharacterWrap;
}
label.font = [label.font fontWithSize:i];
[label sizeToFit];
if(label.frame.size.height < size.height){
break;
}
label.frame = constraintSize;
}
}
Call esto con una etiqueta que tiene su texto favorito y la fuente:
UILabel *label = [[UILabel alloc] initWithFrame: CGRectZero];
label.backgroundColor = [UIColor clearColor];
label.textColor = [UIColor whiteColor];
label.text = text;
label.font = [UIFont fontWithName: @"Helvetica" size: 16];
[self setFontSizeOfMultiLineLabel: label toFitSize: CGSizeMake(200, 44) forMaxFontSize: 16 andMinFontSize: 8 startCharacterWrapAtSize: 11];
el parámetro startCharacterWrapAtSize le permite elegir utilizar characterWrap empezando por el tamaño de la fuente dando. Esto debería ahorrar espacio en el caso de que WordWrap usara fuentes realmente pequeñas.
edición: corrección de errores
sizeWithFont está en desuso en iOS7 y se debe usar boundingRectWithSize en su lugar. –