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