¿El tamaño de UILABETHhatFits devuelve su altura?

Estoy intentando implementar lo siguiente en mi aplicación:

themeLabel = [[UILabel alloc] init]; themeLabel.backgroundColor = [UIColor networkingColor]; themeLabel.text = themeString; [themeLabel sizeThatFits:CGSizeMake(274, 274)]; themeLabel.numberOfLines = 0; [topThemeView addSubview:themeLabel]; NSLog(@"Height is %f ", themeLabel.frame.size.height); [themeLabel setFrame:CGRectMake(leftMargin, mainScrollView.frame.origin.y + topPadding, 274, themeLabel.frame.size.height)]; 

Y termino con la altura de la Label's que es 0.0 . ¿Alguna idea de por qué?

 themeLabel = [[UILabel alloc] init]; themeLabel.backgroundColor = [UIColor networkingColor]; themeLabel.text = themeString; themeLabel.numberOfLines = 0; CGRect labelFrame = CGRectMake(leftMargin, mainScrollView.frame.origin.y + topPadding, 0.0, 0.0); labelFrame.size = [themeLabel sizeThatFits:CGSizeMake(274, 274)]; [themeLabel setFrame:labelFrame]; [topThemeView addSubview:themeLabel]; 

sizeThatFits le pide a la vista que calcule y devuelva el tamaño que mejor se ajuste a sus subvenciones. Entonces, nunca estás configurando el marco de themeLabel

deberías hacer:

 themeLabel.numberOfLines = 0; CGSize size = [themeLabel sizeThatFits:CGSizeMake(274, 274)]; themeLabel.frame = (CGRect) {0,0, size}; 

Creé una categoría para manipular altura para UILabels:

UILabel + TCFlexibleHeight.h :

 #import <UIKit/UIKit.h> @interface UILabel (TCFlexibleHeight) - (CGFloat)heightForText:(NSString*)text; - (CGFloat)heightForCurrentText; - (CGFloat)adjustHeightForCurrentText; @end 

UILabel + TCFlexibleHeight.m :

 #import "UILabel+TCFlexibleHeight.h" static const NSInteger kMaxLines = 1000; @implementation UILabel (TCFlexibleHeight) - (CGFloat)heightForText:(NSString*)text { if (text == nil) { return 0; } NSInteger numberOfLines = self.numberOfLines > 0 ? self.numberOfLines : kMaxLines; CGSize size = CGSizeMake(self.frame.size.width, self.font.lineHeight * numberOfLines); return [text sizeWithFont:self.font constrainedToSize:size lineBreakMode:self.lineBreakMode].height; } - (CGFloat)heightForCurrentText { return [self heightForText:self.text]; } - (CGFloat)adjustHeightForCurrentText { CGFloat height = [self heightForCurrentText]; CGRect frame = self.frame; frame.size.height = height; return height; } @end 

Con esta categoría su código será algo como esto:

 [themeLabel setFrame:CGRectMake(leftMargin, mainScrollView.frame.origin.y + topPadding, 274, [themeLabel heightForCurrentText])]; 

Tenga en count que esta categoría no maneja cadenas atribuidas y requiere que el set de líneas de ajuste se grabe en caracteres.