ios - ''sizeWithFont: restricinedToSize: lineBreakMode:'' está en desuso:
xcode uikit (6)
El boundingRectWithSize: opciones: atributos: contexto tiene el problema, que no calcula la altura correctamente si la cadena contiene "/ n" (saltos de línea). Por lo tanto, este código calcula el tamaño de cada línea por separado para un ancho determinado (en ancho):
NSArray *brokenByLines=[string componentsSeparatedByString:@"/n"];
CGFloat height=0.0;
CGFloat maxWidth=0.0;
for (NSString* actString in brokenByLines) {
CGRect tSize=[actString boundingRectWithSize:CGSizeMake(inWidth, 600) options:(NSStringDrawingUsesLineFragmentOrigin | NSLineBreakByWordWrapping) attributes:@{NSFontAttributeName: inFont} context:nil];
if (maxWidth<tSize.size.width) {
maxWidth=tSize.size.width;
}
height+=tSize.size.height;
}
CGSize size= CGSizeMake(ceil(maxWidth), ceil(height));
Convertir un proyecto de iOS5.0 a iOS7 / iOS6 en Xcode 5. El siguiente código muestra una advertencia de tiempo de compilación:
''sizeWithFont: restricinedToSize: lineBreakMode:'' está en desuso: primero en desuso en ios 7.0 - Use - boundingRectWithSize: opciones: atributos: contexto
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
if (indexPath.section == 0)
{
self.lblHidden.frame = CGRectMake(58, 228, 945, 9999);
self.lblHidden.text = detailShareObj.pDesc;
CGSize size = [detailShareObj.pDesc sizeWithFont:self.lblHidden.font constrainedToSize:self.lblHidden.frame.size lineBreakMode:NSLineBreakByWordWrapping];
return 228.0+size.height+20;
}
else if (indexPath.section == 1)
{
NSString *tempPointStr = (self.shortDescArray)[indexPath.row];
self.lblHidden.frame = CGRectMake(58, 0, 945, 9999);
self.lblHidden.text = tempPointStr;
CGSize size = [tempPointStr sizeWithFont:self.lblHidden.font
constrainedToSize:self.lblHidden.frame.size
lineBreakMode:NSLineBreakByWordWrapping];
return 50.0f;
}
Intenté algunas de las sugerencias dadas en otros lugares, pero no hay nada que rescatar si alguien puede ayudar al dar las correcciones requeridas en el código será muy apreciado.
Para iOS7, reemplace:
CGSize size = [tempPointStr sizeWithFont:self.lblHidden.font
constrainedToSize:self.lblHidden.frame.size
lineBreakMode:NSLineBreakByWordWrapping];
Con:
NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc]init];
paragraphStyle.lineBreakMode = NSLineBreakByWordWrapping; //set the line break mode
NSDictionary *attrDict = [NSDictionary dictionaryWithObjectsAndKeys:self.lblHidden.font, NSFontAttributeName, paragraphStyle, NSParagraphStyleAttributeName, nil];
CGSize size = [tempPointStr boundingRectWithSize:self.lblHidden.frame.size
options:NSStringDrawingTruncatesLastVisibleLine|NSStringDrawingUsesLineFragmentOrigin
attributes:attrDict context:nil].size;
Puedes usar:
UIFont *font = [UIFont boldSystemFontOfSize:16];
CGRect new = [string boundingRectWithSize:CGSizeMake(200, 300)
options:NSStringDrawingUsesFontLeading
attributes:@{NSFontAttributeName: font}
context:nil];
CGSize stringSize= new.size;
Si está apuntando a iOS 6.0+, aún puede usar sizeWithFont:constrainedToSize:lineBreakMode:
Solo asegúrese de que el iOS Deployment Target
su proyecto esté configurado para 6.0, y que el compilador no le dé estas advertencias.
(Puede encontrar esto haciendo clic en la pestaña azul del proyecto (generalmente en la parte superior izquierda, en el panel del navegador del proyecto) dentro de la sección "información").
Si solo está apuntando a iOS 7.0+, debe usar el nuevo método boundingRectWithSize:options:attributes:context
.
Puedes encontrar los documentos de Apple en este nuevo método aquí.
Si quieres que sea compatible con iOS7 y las versiones siguientes, prueba este (con ARC):
CGSize size;
if ([tempPointStr respondsToSelector:
@selector(boundingRectWithSize:options:attributes:context:)])
{
NSMutableParagraphStyle * paragraphStyle = [[NSMutableParagraphStyle alloc] init];
paragraphStyle.lineBreakMode = NSLineBreakByWordWrapping;
paragraphStyle.alignment = NSTextAlignmentLeft;
NSDictionary * attributes = @{NSFontAttributeName : self.lblHidden.font,
NSParagraphStyleAttributeName : paragraphStyle};
size = [tempPointStr boundingRectWithSize:self.lblHidden.frame.size
options:NSStringDrawingUsesFontLeading
|NSStringDrawingUsesLineFragmentOrigin
attributes:attributes
context:nil].size;
} else {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
size = [tempPointStr sizeWithFont:self.lblHidden.font
constrainedToSize:self.lblHidden.frame.size
lineBreakMode:NSLineBreakByWordWrapping];
#pragma clang diagnostic pop
}
Nota : es solo un ejemplo para su else-if
caso, else-if
es que necesita hacer alguna modificación, dependiendo de lo que quiera que sea. ;)
Simplemente no enmascararía la advertencia de la función en desuso. Lo desaprobaron por una razón. Creo que la función estaba en desuso porque esa serie de funciones NSString + UIKit se basaban en la biblioteca UIStringDrawing, que no era segura para subprocesos. Si intentaste ejecutarlos no en el hilo principal (como cualquier otra funcionalidad de UIKit), obtendrás comportamientos impredecibles. En particular, si ejecutó la función en varios subprocesos simultáneamente, probablemente bloqueará su aplicación. Es por eso que en iOS 6, introdujeron el método boundingRectWithSize:...
para NSAttributedStrings. Esto se creó sobre las bibliotecas NSStringDrawing y es seguro para subprocesos.
Si observa la nueva función boundingRectWithSize:...
NSString, solicita una matriz de atributos de la misma manera que una NSAttributeString. Si tuviera que adivinar, esta nueva función NSString en iOS 7 es simplemente una envoltura para la función NSAttributeString de iOS 6.
En esa nota, si solo estuvieras soportando iOS 6 y iOS 7, definitivamente cambiaría todo el tamaño de tu sizeWithFont:...
a la NSAttributeString''s boundingRectWithSize
. ¡Te ahorrará muchos dolores de cabeza si tienes un extraño estuche de esquina con subprocesos múltiples! Aquí es cómo convertí sizeWithFont de sizeWithFont:constrainedToSize:
::
Lo que solía ser:
NSString *text = ...;
CGFloat width = ...;
UIFont *font = ...;
CGSize size = [text sizeWithFont:font
constrainedToSize:(CGSize){width, CGFLOAT_MAX}];
Puede ser reemplazado por:
NSString *text = ...;
CGFloat width = ...;
UIFont *font = ...;
NSAttributedString *attributedText =
[[NSAttributedString alloc]
initWithString:text
attributes:@
{
NSFontAttributeName: font
}];
CGRect rect = [attributedText boundingRectWithSize:(CGSize){width, CGFLOAT_MAX}
options:NSStringDrawingUsesLineFragmentOrigin
context:nil];
CGSize size = rect.size;
Por favor, tenga en cuenta la documentación menciona:
En iOS 7 y versiones posteriores, este método devuelve tamaños fraccionarios (en el componente de tamaño del CGRect devuelto); para usar un tamaño devuelto a las vistas de tamaño, debe usar aumentar su valor al número entero más cercano utilizando la función ceil.
Por lo tanto, para extraer la altura o el ancho calculados que se usarán para dimensionar las vistas, usaría:
CGFloat height = ceilf(size.height);
CGFloat width = ceilf(size.width);