objective c - El método sizeWithFont está en desuso. boundingRectWithSize devuelve un valor inesperado
objective-c nsstring (6)
¿Qué tal crear una nueva etiqueta y usar sizeThatFit:(CGSize)size
?
UILabel *gettingSizeLabel = [[UILabel alloc] init];
gettingSizeLabel.font = [UIFont fontWithName:@"YOUR FONT''s NAME" size:16];
gettingSizeLabel.text = @"YOUR LABEL''s TEXT";
gettingSizeLabel.numberOfLines = 0;
gettingSizeLabel.lineBreakMode = NSLineBreakByWordWrapping;
CGSize maximumLabelSize = CGSizeMake(310, CGFLOAT_MAX);
CGSize expectSize = [gettingSizeLabel sizeThatFits:maximumLabelSize];
Editar: Este código superior no es bueno para iOS 7 y superior, por lo que debe usar a continuación:
CGRect textRect = [myString boundingRectWithSize:maximumLabelSize
options:NSStringDrawingUsesLineFragmentOrigin| NSStringDrawingUsesFontLeading
attributes:@{NSFontAttributeName:fontText}
context:nil];
En iOS7, sizeWithFont
está en desuso, por lo que estoy usando boundingRectWithSize
(que devuelve un valor de CGRect). Mi código:
UIFont *fontText = [UIFont fontWithName:[AppHandlers zHandler].fontName size:16];
// you can use your font.
CGSize maximumLabelSize = CGSizeMake(310, 9999);
CGRect textRect = [myString boundingRectWithSize:maximumLabelSize
options:NSStringDrawingUsesLineFragmentOrigin
attributes:@{NSFontAttributeName:fontText}
context:nil];
expectedLabelSize = CGSizeMake(textRect.size.width, textRect.size.height);
En textRect
, textRect
un tamaño mayor que mi maximumLabelSize
, un tamaño diferente que cuando uso sizeWithFont
. ¿Cómo puedo resolver este problema?
Aquí está mi fragmento de código que funciona:
NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithDictionary:attributeDict];
NSString *headline = [dict objectForKey:@"title"];
UIFont *font = [UIFont boldSystemFontOfSize:18];
CGRect rect = [headline boundingRectWithSize:CGSizeMake(300, 1000) options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName:font} context:nil];
CGFloat height = roundf(rect.size.height +4)
Agregué 4px a la altura calculada, porque sin estos 4px, falta una línea.
Utilizo este fragmento de código en una vista de tabla y agrego la "altura" a una matriz de NSNumbers y obtengo la altura de celda correcta para la etiqueta de texto predeterminada.
Agregue 4 píxeles más si desea más espacio debajo del texto en la etiqueta de texto.
**** ACTUALIZACIÓN ****
No estoy de acuerdo con el "error de ancho de 40px", digo que son 4px de altura faltante, porque 4px es la altura predeterminada de un espacio entre una letra y el límite de una sola línea. Puede verificarlo con un UILabel, para un tamaño de fuente de 16 necesita una altura UILabel de 20.
Pero si su última línea no tiene "g" o lo que sea, la medición podría pasar por alto los 4px de altura.
Lo volví a comprobar con un pequeño método, obtengo una altura precisa de 20,40 o 60 para mi etiqueta y un ancho inferior a 300 píxeles.
Para admitir iOS6 e iOS7, puedes usar mi método:
- (CGFloat)heightFromString:(NSString*)text withFont:(UIFont*)font constraintToWidth:(CGFloat)width
{
CGRect rect;
float iosVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
if (iosVersion >= 7.0) {
rect = [text boundingRectWithSize:CGSizeMake(width, 1000) options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName:font} context:nil];
}
else {
CGSize size = [text sizeWithFont:font constrainedToSize:CGSizeMake(width, 1000) lineBreakMode:NSLineBreakByWordWrapping];
rect = CGRectMake(0, 0, size.width, size.height);
}
NSLog(@"%@: W: %.f, H: %.f", self, rect.size.width, rect.size.height);
return rect.size.height;
}
**** ACTUALIZACIÓN ****
Gracias a sus comentarios, actualicé mi función de la siguiente manera. Como sizeWithFont está en desuso y recibirá una advertencia en XCode, agregué el código pragma de diagnóstico para eliminar la advertencia de esta función en particular: llamada / bloque de código.
- (CGFloat)heightFromStringWithFont:(UIFont*)font constraintToWidth:(CGFloat)width
{
CGRect rect;
if ([self respondsToSelector:@selector(boundingRectWithSize:options:attributes:context:)]) {
rect = [self boundingRectWithSize:CGSizeMake(width, 1000) options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName:font} context:nil];
}
else {
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
CGSize size = [self sizeWithFont:font constrainedToSize:CGSizeMake(width, 1000) lineBreakMode:NSLineBreakByWordWrapping];
rect = CGRectMake(0, 0, size.width, size.height);
#pragma GCC diagnostic pop
}
return ceil(rect.size.height);
}
Además del tema de 4px: dependiendo de la fuente y el peso de la fuente que use, el cálculo devuelve diferentes valores de altura. En mi caso: HelveticaNeue-Medium con una fuente de 16.0 devuelve una altura de línea de 20.0 para una sola línea, pero 39.0 para dos líneas, 78px para 4 líneas - falta> 1px para cada línea - comenzando con la línea 2 - pero desea para tener tu espacio de líneas fontsize + 4px para cada línea debes obtener un resultado de altura.
Por favor, tenlo en cuenta durante la codificación.
Aún no tengo una función para este "problema", pero actualizaré esta publicación cuando haya terminado.
El comentario de @ SoftDesigner me ha funcionado
CGRect descriptionRect = [description boundingRectWithSize:CGSizeMake(width, 0)
options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading)
attributes:@{NSFontAttributeName : [UIFont systemFontOfSize:12]}
context:nil];
result = ceil(descriptionRect.size.height);
Si entiendo correctamente, estás utilizando boundingRectWithSize: solo como una forma de obtener el tamaño que obtendrías con sizeWithFont (lo que significa que quieres directamente el CGSize, no el CGRect).
Esto se parece a lo que estás buscando:
Reemplazo por tamaño obsoletoConFondo: ¿en iOS 7?
Están usando sizeWithAttributes: para obtener el tamaño, como reemplazo de sizeWithFont.
¿Todavía obtienes el tamaño incorrecto usando algo como esto?
UIFont *fontText = [UIFont fontWithName:[AppHandlers zHandler].fontName size:16];
// you can use your font.
expectedLabelSize = [myString sizeWithAttributes:@{NSFontAttributeName:fontText}];
Tal vez deba proporcionar una opción adicional al método que se sugiere en this respuesta:
CGSize maximumLabelSize = CGSizeMake(310, CGFLOAT_MAX);
CGRect textRect = [myString boundingRectWithSize:maximumLabelSize
options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading)
attributes:@{NSFontAttributeName: fontText}
context:nil];
para encontrar el tamaño del tiempo de ejecución de la etiqueta sizewithfont está en desuso para iOS 7.0 en lugar de eso, tiene que usar -boundingRectWithSize: options: attributes: context: method
puedes usarlo como código debajo
CGSize constraint = CGSizeMake(MAXIMUM_WIDHT, TEMP_HEIGHT);
NSRange range = NSMakeRange(0, [[self.message body] length]);
NSDictionary *attributes = [YOUR_LABEL.attributedText attributesAtIndex:0 effectiveRange:&range];
CGSize boundingBox = [myString boundingRectWithSize:constraint options:NSStringDrawingUsesFontLeading attributes:attributes context:nil].size;
int numberOfLine = ceil((boundingBox.width) / YOUR_LABEL.frame.size.width);
CGSize descSize = CGSizeMake(ceil(boundingBox.width), ceil(self.lblMessageDetail.frame.size.height*numberOfLine));
CGRect frame=YOUR_LABEL.frame;
frame.size.height=descSize.height;
YOUR_LABEL.frame=frame;
aquí debe dar ancho a la longitud máxima para encontrar alto o ancho.
prueba esto, está funcionando para mí.