ios iphone ios7 nsstring sizewithfont

Reemplazo por obsoleto-sizeWithFont: constrainedToSize: lineBreakMode: ¿en iOS 7?



iphone ios7 (8)

A continuación hay dos métodos simples que reemplazarán estos dos métodos en desuso.

Y aquí están las referencias relevantes:

Si está utilizando NSLineBreakByWordWrapping, no necesita especificar NSParagraphStyle, ya que es el valor predeterminado: https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSParagraphStyle_Class/index.html#//apple_ref/occ/clm/NSParagraphStyle/defaultParagraphStyle

Debe obtener el tope del tamaño para que coincida con los resultados de los métodos obsoletos. https://developer.apple.com/library/ios/documentation/UIKit/Reference/NSString_UIKit_Additions/#//apple_ref/occ/instm/NSString/boundingRectWithSize:options:attributes:context :

+ (CGSize)text:(NSString*)text sizeWithFont:(UIFont*)font { CGSize size = [text sizeWithAttributes:@{NSFontAttributeName: font}]; return CGSizeMake(ceilf(size.width), ceilf(size.height)); } + (CGSize)text:(NSString*)text sizeWithFont:(UIFont*)font constrainedToSize:(CGSize)size{ CGRect textRect = [text boundingRectWithSize:size options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName: font} context:nil]; return CGSizeMake(ceilf(textRect.size.width), ceilf(textRect.size.height)); }

En iOS 7, el método:

- (CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size lineBreakMode:(NSLineBreakMode)lineBreakMode

y el método:

- (CGSize)sizeWithFont:(UIFont *)font

están en desuso ¿Cómo puedo reemplazar

CGSize size = [string sizeWithFont:font constrainedToSize:constrainSize lineBreakMode:NSLineBreakByWordWrapping];

y:

CGSize size = [string sizeWithFont:font];


Aquí hay una solución simple:

Requisitos:

CGSize maximumSize = CGSizeMake(widthHere, MAXFLOAT); UIFont *font = [UIFont systemFontOfSize:sizeHere];

Ahora como constrainedToSizeusage:lineBreakMode: uso está en desuso en iOS 7.0 :

CGSize expectedSize = [stringHere sizeWithFont:font constrainedToSize:maximumSize lineBreakMode:NSLineBreakByWordWrapping];

Ahora el uso en la versión más grande de iOS 7.0 será:

// Let''s make an NSAttributedString first NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:stringHere]; //Add LineBreakMode NSMutableParagraphStyle *paragraphStyle = [NSMutableParagraphStyle new]; [paragraphStyle setLineBreakMode:NSLineBreakByWordWrapping]; [attributedString setAttributes:@{NSParagraphStyleAttributeName:paragraphStyle} range:NSMakeRange(0, attributedString.length)]; // Add Font [attributedString setAttributes:@{NSFontAttributeName:font} range:NSMakeRange(0, attributedString.length)]; //Now let''s make the Bounding Rect CGSize expectedSize = [attributedString boundingRectWithSize:maximumSize options:NSStringDrawingUsesLineFragmentOrigin context:nil].size;


Como no podemos usar sizeWithAttributes para todos los iOS mayores de 4.3, tenemos que escribir el código condicional para iOS 7.0 o anterior.

1) Solución 1:

if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) { CGSize size = CGSizeMake(230,9999); CGRect textRect = [specialityObj.name boundingRectWithSize:size options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:[UIFont fontWithName:[AppHandlers zHandler].fontName size:14]} context:nil]; total_height = total_height + textRect.size.height; } else { CGSize maximumLabelSize = CGSizeMake(230,9999); expectedLabelSize = [specialityObj.name sizeWithFont:[UIFont fontWithName:[AppHandlers zHandler].fontName size:14] constrainedToSize:maximumLabelSize lineBreakMode:UILineBreakModeWordWrap]; //iOS 6 and previous. total_height = total_height + expectedLabelSize.height; }

2) Solución 2

UILabel *gettingSizeLabel = [[UILabel alloc] init]; gettingSizeLabel.font = [UIFont fontWithName:[AppHandlers zHandler].fontName size:16]; // Your Font-style whatever you want to use. gettingSizeLabel.text = @"YOUR TEXT HERE"; gettingSizeLabel.numberOfLines = 0; CGSize maximumLabelSize = CGSizeMake(310, 9999); // this width will be as per your requirement CGSize expectedSize = [gettingSizeLabel sizeThatFits:maximumLabelSize];

La primera solución a veces no puede devolver el valor correcto de altura. entonces usa otra solución que funcionará perfectamente

La segunda opción está bastante bien y funciona sin problemas en todos los iOS sin código condicional.


En la mayoría de los casos, utilicé el método sizeWithFont: constrainedToSize: lineBreakMode: para estimar el tamaño mínimo para que un UILabel acomode su texto (especialmente cuando la etiqueta debe colocarse dentro de una UITableViewCell) ...

... Si esta es exactamente su situación, puede usar el método simpy:

CGSize size = [myLabel textRectForBounds:myLabel.frame limitedToNumberOfLines:mylabel.numberOfLines].size;

Espero que esto pueda ayudar.


Puedes intentar esto:

CGRect textRect = [text boundingRectWithSize:size options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:FONT} context:nil]; CGSize size = textRect.size;

Simplemente cambie "FONT" por "[UIFont font ....]"


[La respuesta aceptada funciona bien en una categoría. Estoy sobrescribiendo los nombres de métodos en desuso. ¿Es esta una buena idea? Parece que funciona sin quejas en Xcode 6.x]

Esto funciona si su objetivo de implementación es 7.0 o superior. La categoría es NSString (Util)

NSString + Util.h

- (CGSize)sizeWithFont:(UIFont *) font; - (CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size;

NSString + Util.m

- (CGSize)sizeWithFont:(UIFont *) font { NSDictionary *fontAsAttributes = @{NSFontAttributeName:font}; return [self sizeWithAttributes:fontAsAttributes]; } - (CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size { NSDictionary *fontAsAttributes = @{NSFontAttributeName:font}; CGRect retVal = [self boundingRectWithSize:size options:NSStringDrawingUsesLineFragmentOrigin attributes:fontAsAttributes context:nil]; return retVal.size; }


UIFont *font = [UIFont boldSystemFontOfSize:16]; CGRect new = [string boundingRectWithSize:CGSizeMake(200, 300) options:NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName: font} context:nil]; CGSize stringSize= new.size;


UIFont *font = [UIFont fontWithName:@"Courier" size:16.0f]; NSMutableParagraphStyle *paragraphStyle = [[NSParagraphStyle defaultParagraphStyle] mutableCopy]; paragraphStyle.lineBreakMode = NSLineBreakByTruncatingTail; paragraphStyle.alignment = NSTextAlignmentRight; NSDictionary *attributes = @{ NSFontAttributeName: font, NSParagraphStyleAttributeName: paragraphStyle }; CGRect textRect = [text boundingRectWithSize:size options:NSStringDrawingUsesLineFragmentOrigin attributes:attributes context:nil]; CGSize size = textRect.size;

de dos respuestas 1 + 2