ios iphone objective-c ios6 ios7

Obtener dinĂ¡micamente la altura de UILabel de acuerdo con el valor de retorno de texto diferente para iOS 7.0 y iOS 6.1



iphone objective-c (13)

Aquí hay una solución total para el ancho y la altura. Ponga estos en su AppDelegate:

+(void)fixHeightOfThisLabel:(UILabel *)aLabel { aLabel.frame = CGRectMake(aLabel.frame.origin.x, aLabel.frame.origin.y, aLabel.frame.size.width, [AppDelegate heightOfTextForString:aLabel.text andFont:aLabel.font maxSize:CGSizeMake(aLabel.frame.size.width, MAXFLOAT)]); } +(CGFloat)heightOfTextForString:(NSString *)aString andFont:(UIFont *)aFont maxSize:(CGSize)aSize { // iOS7 if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) { CGSize sizeOfText = [aString boundingRectWithSize: aSize options: (NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading) attributes: [NSDictionary dictionaryWithObject:aFont forKey:NSFontAttributeName] context: nil].size; return ceilf(sizeOfText.height); } // iOS6 CGSize textSize = [aString sizeWithFont:aFont constrainedToSize:aSize lineBreakMode:NSLineBreakByWordWrapping]; return ceilf(textSize.height; } +(void)fixWidthOfThisLabel:(UILabel *)aLabel { aLabel.frame = CGRectMake(aLabel.frame.origin.x, aLabel.frame.origin.y, [AppDelegate widthOfTextForString:aLabel.text andFont:aLabel.font maxSize:CGSizeMake(MAXFLOAT, aLabel.frame.size.height)], aLabel.frame.size.height); } +(CGFloat)widthOfTextForString:(NSString *)aString andFont:(UIFont *)aFont maxSize:(CGSize)aSize { // iOS7 if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) { CGSize sizeOfText = [aString boundingRectWithSize: aSize options: (NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading) attributes: [NSDictionary dictionaryWithObject:aFont forKey:NSFontAttributeName] context: nil].size; return ceilf(sizeOfText.width); } // iOS6 CGSize textSize = [aString sizeWithFont:aFont constrainedToSize:aSize lineBreakMode:NSLineBreakByWordWrapping]; return ceilf(textSize.width); }

luego para usar esto, establece el texto de la etiqueta:

label.numberOfLines = 0; label.text = @"Everyone loves Stack OverFlow";

y llama:

[AppDelegate fixHeightOfThisLabel:label];

Nota: numberOfLines de la etiqueta se debe establecer en 0. Espero que esto ayude.

Estoy usando este método para obtener la altura de UILabel Dinámicamente:

+(CGSize) GetSizeOfLabelForGivenText:(UILabel*)label Font:(UIFont*)fontForLabel Size: (CGSize)LabelSize{ label.numberOfLines = 0; CGSize labelSize = [label.text sizeWithFont:fontForLabel constrainedToSize:LabelSize lineBreakMode:NSLineBreakByCharWrapping]; return (labelSize); }

Con esta solución, obtengo el tamaño exacto de UILabel si mi código se está ejecutando en una versión inferior a iOS 8, pero si ejecuto mi aplicación en iOS7, devuelve un valor diferente.


Cualquiera que sea la altura que estoy obteniendo a través de este código (método que he escrito en esta pregunta anterior). Proporciona la altura en valor flotante (86.4) , una vez que obtenemos eso e intentamos establecer esa altura en UILabel, pero necesitamos obtener el valor desde la altura con ceil (87) en lugar del valor tal como es (86.4) . He resuelto mi problema con este enfoque. Y gracias por sus respuestas.


El método sizeWithFont:constrainedToSize:lineBreakMode: está en desuso en iOS7. Debes usar sizeWithAttributes: lugar.

Ejemplo:

NSDictionary *fontAttributes = @{NSFontAttributeName : [UIFont systemFontOfSize:15]}; CGSize textSize = [self.myLabel.text sizeWithAttributes:fontAttributes]; CGFloat textWidth = textSize.width; CGFloat textHeight = textSize.height;


Este método es utilizado y probado por mí desde iOS 7 a iOS 11.4

+ (CGFloat)getLabelHeight:(UILabel*)label { NSParameterAssert(label); CGSize limitLabel = CGSizeMake(label.frame.size.width, CGFLOAT_MAX); CGSize size; NSStringDrawingContext *context = [[NSStringDrawingContext alloc] init]; CGSize labelBox = [label.text boundingRectWithSize: limitLabel options: NSStringDrawingUsesLineFragmentOrigin attributes: @{ NSFontAttributeName:label.font } context: context].size; size = CGSizeMake(ceil(labelBox.width), ceil(labelBox.height)); return size.height; }

Así que puedes usar así:

CGFloat sizeOfFontTest = 12.0; UILabel *testLabel = [[UILabel alloc] initWithFrame: CGRectMake(0, 0, 100, 0)]; [testLabel setFont: [UIFont systemFontOfSize: sizeOfFontTest]]; [testLabel setText: @"Hello Large String Example"]; CGFloat heightTestLabel = [self getLabelHeight: testLabel]; [testLabel setFrame: CGRectMake(testLabel.frame.origin.x, testLabel.frame.origin.y, testLabel.frame.size.width, heightAddrsLab)]; [testLabel setNumberOfLines: sizeOfFontTest / heightTestLabel];


Esto es lo que vine finalmente y espero que esto te ayude. Verifiqué la versión de iOS como la propia Apple en la Guía de transición de la interfaz de usuario de iOS 7 , que implica revisar la versión de Foundation Framework y utilicé #pragma para suprimir la advertencia de desaprobación: iOS 7 o posterior con "- (CGSize) sizeWithFont: (UIFont * ) fuente de tamaño restringido: Tamaño (CGSize) ".

+ (CGSize)getStringBoundingSize:(NSString*)string forWidth:(CGFloat)width withFont:(UIFont*)font{ CGSize maxSize = CGSizeMake(width, CGFLOAT_MAX); if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_6_1) { // for iOS 6.1 or earlier // temporarily suppress the warning and then turn it back on // since sizeWithFont:constrainedToSize: deprecated on iOS 7 or later #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wdeprecated-declarations" maxSize = [string sizeWithFont:font constrainedToSize:maxSize]; #pragma clang diagnostic pop } else { // for iOS 7 or later maxSize = [string sizeWithAttributes:@{NSFontAttributeName:font}]; } return maxSize; }


La respuesta aceptada es demasiado larga. Puedes usar lo siguiente:

+(CGSize) GetSizeOfLabelForGivenText:(UILabel*)label Font:(UIFont*)fontForLabel Size: (CGSize) constraintSize{ label.numberOfLines = 0; CGRect labelRect = [label.text boundingRectWithSize:constraintSize options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading) attributes:@{NSFontAttributeName:fontForLabel} context:nil]; return (labelRect.size); }


La respuesta aceptada no me satisfizo, así que tuve que desenterrar esto en mi código:

CGSize possibleSize = [string sizeWithFont:[UIFont fontWithName:@"HelveticaNeue" size:10] //font you are using constrainedToSize:CGSizeMake(skillsMessage.frame.size.width,9999) lineBreakMode:NSLineBreakByWordWrapping]; CGRect newFrame = label.frame; newFrame.size.height = possibleSize.height; label.frame = newFrame;


Si está utilizando alguna de las fuentes del sistema, cambiaron en iOS 7 por lo que serían de diferentes tamaños.

Además, sizeWithFont:constrainedToSize:lineBreakMode: está en desuso en iOS 7. Use sizeWithAttributes: lugar (si está en iOS 7)


Super simple Solo obtenga el área del texto, divida por ancho, luego redondee hasta la altura más cercana que se ajuste a su fuente.

+ (CGFloat)heightForText:(NSString*)text font:(UIFont*)font withinWidth:(CGFloat)width { CGSize size = [text sizeWithAttributes:@{NSFontAttributeName:font}]; CGFloat area = size.height * size.width; CGFloat height = roundf(area / width); return ceilf(height / font.lineHeight) * font.lineHeight; }

Muy una solución plug and play. Lo uso mucho en una clase de ayuda, especialmente para UITableViewCells de tamaño dinámico.

Espero que esto ayude a otros en el futuro!


Tengo una situación en la que necesito establecer la altura de la etiqueta dinámicamente según el texto. Estoy usando Xcode 7.1 y mi objetivo de implementación del proyecto es 7.0, pero lo probé en el simulador de iOS 9 y la siguiente solución funciona para mí. Aquí está la solución: en primer lugar, creará un diccionario como este:

NSDictionary *attributes = @{NSFontAttributeName:self.YOUR_LABEL.font};

ahora calcularemos la altura y el ancho de nuestro texto y aprobaremos el diccionario recién creado.

CGRect rect = [YOUR_TEXT_STRING boundingRectWithSize:CGSizeMake(LABEL_WIDTH, CGFLOAT_MAX) options:NSStringDrawingUsesLineFragmentOrigin attributes:attributes context:nil];

Luego fijaremos el marco de nuestra ETIQUETA:

self.YOUR_LABEL.frame = CGRectMake(self.YOUR_LABEL.frame.origin.x, self.YOUR_LABEL.frame.origin.y, self.YOUR_LABEL.frame.size.width, rect.size.height);

ESTO ES CÓMO CONFIGURÉ CON ÉXITO EL MARCO DE MI ETIQUETA SEGÚN EL TEXTO.


Tienes que configurar dinámicamente el marco, como a continuación:

//Compatible for both ios6 and ios7. CGSize constrainedSize = CGSizeMake(self.resizableLable.frame.size.width , 9999); NSDictionary *attributesDictionary = [NSDictionary dictionaryWithObjectsAndKeys: [UIFont fontWithName:@"HelveticaNeue" size:11.0], NSFontAttributeName, nil]; NSMutableAttributedString *string = [[NSMutableAttributedString alloc] initWithString:@"textToShow" attributes:attributesDictionary]; CGRect requiredHeight = [string boundingRectWithSize:constrainedSize options:NSStringDrawingUsesLineFragmentOrigin context:nil]; if (requiredHeight.size.width > self.resizableLable.frame.size.width) { requiredHeight = CGRectMake(0,0, self.resizableLable.frame.size.width, requiredHeight.size.height); } CGRect newFrame = self.resizableLable.frame; newFrame.size.height = requiredHeight.size.height; self.resizableLable.frame = newFrame;


Yo siempre uso sizeThatFits:

CGRect frame = myLabel.frame; CGSize constraint = CGSizeMake(CGRectGetWidth(myLabel.frame), 20000.0f); CGSize size = [myLabel sizeThatFits:constraint]; frame.size.height = size.height; myLabel.frame = frame;

Puedes probar esto


este código es para mover cuatro etiquetas en el sentido de las agujas del reloj con el toque del botón, usando la función para el botón

(void)onclick { CGRect newFrame; CGRect newFrame1 = lbl1.frame; CGRect newFrame2 = lbl2.frame; CGRect newFrame3 = lbl3.frame; CGRect newFrame4 = lbl4.frame; lbl1.frame=newFrame; lbl4.frame=newFrame1; lbl3.frame=newFrame4; lbl2.frame=newFrame3; lbl1.frame=newFrame2; }