En iOS7, sizeWithFont
está en desuso, por lo que estoy usando boundingRectWithSize
(que devuelve un valor 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
, obtengo un tamaño mayor que el mío maximumLabelSize
, un tamaño diferente al que usé sizeWithFont
. ¿Cómo puedo resolver este problema?
objective-c
nsstring
ios7
uilabel
Nirav Jain
fuente
fuente
Respuestas:
¿Qué tal crear una nueva etiqueta y usarla
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, así que utilícelo a continuación:
CGRect textRect = [myString boundingRectWithSize:maximumLabelSize options:NSStringDrawingUsesLineFragmentOrigin| NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName:fontText} context:nil];
fuente
Tal vez necesite proporcionar una opción adicional al método que se sugiere en esta respuesta:
CGSize maximumLabelSize = CGSizeMake(310, CGFLOAT_MAX); CGRect textRect = [myString boundingRectWithSize:maximumLabelSize options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading) attributes:@{NSFontAttributeName: fontText} context:nil];
fuente
boundingRectWithSize
está roto. Probé en iOS 7, 7.1.1 y no devuelve resultados correctos.Aquí está mi fragmento de código de trabajo:
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 un tableView 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", grito que sean los 4px de altura que faltan, porque 4px es la altura predeterminada de un espacio entre una letra y el límite de una sola línea. Puede comprobarlo con una UILabel, para un tamaño de fuente de 16 necesita una altura de UILabel de 20.
Pero si su última línea no tiene "g" o lo que sea, la medición podría perder los 4px de altura.
Lo volví a verificar con un pequeño método, obtengo una altura precisa de 20,40 o 60 para mi etiqueta y un ancho correcto de menos de 300px.
Para admitir iOS6 e iOS7, puede 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; }
**** POTENCIAR ****
Gracias a sus comentarios, actualicé mi función de la siguiente manera. Dado que sizeWithFont está en desuso y recibirá una advertencia en XCode, agregué el diagnóstico-pragma-code para eliminar la advertencia para esta función / bloque de código en particular.
- (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 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 un tamaño de 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 quieres para tener su tamaño de fuente + espacio de línea de 4px para cada línea, debe obtener un resultado de altura.
¡Tenga esto en cuenta mientras codifica!
Todavía no tengo una función para este "problema" pero actualizaré esta publicación cuando termine.
fuente
Si lo entiendo correctamente, está utilizando boundingRectWithSize: solo como una forma de obtener el tamaño que obtendría con sizeWithFont (lo que significa que desea directamente CGSize, no CGRect).
Esto se parece a lo que está buscando:
Reemplazo de sizeWithFont obsoleto: ¿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}];
fuente
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);
fuente
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, debe usar -boundingRectWithSize: options: attribute: context: method
puedes usarlo como el siguiente código
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í tienes que dar ancho a la longitud máxima para encontrar la altura o el ancho.
prueba esto, me está funcionando.
fuente