En iOS 7, sizeWithFont:
ahora está en desuso. ¿Cómo paso ahora el objeto UIFont al método de reemplazo sizeWithAttributes:
?
objective-c
deprecated
ios7
James Kuang
fuente
fuente
NSString
y unaUILabel
(no SIEMPRE es el caso, pero a menudo lo es), para evitar códigos duplicados / etc., también puede reemplazar[UIFont systemFontOfSize:17.0f]
conlabel.font
: ayuda al mantenimiento del código al hacer referencia a los datos existentes en lugar de escribirlos varias veces o hacer referencia a constantes en todo el lugar, etc.boundingRectWithSize:options:attributes:context:
lugar, usaría , pasandoCGSizeMake(250.0f, CGFLOAT_MAX)
en la mayoría de los casos.Creo que la función fue obsoleta porque esa serie de
NSString+UIKit
funciones (sizewithFont:...
, etc.) se basaron en laUIStringDrawing
biblioteca, que no era segura para subprocesos. Si trató de ejecutarlos no en el hilo principal (como cualquier otraUIKit
funcionalidad), obtendrá 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 unboundingRectWithSize:...
método paraNSAttributedString
. Esto se creó sobre lasNSStringDrawing
bibliotecas y es seguro para subprocesos.Si observa la nueva
NSString
boundingRectWithSize:...
función, solicita una matriz de atributos de la misma manera que aNSAttributeString
. Si tuviera que adivinar, esta nuevaNSString
función en iOS 7 es simplemente un contenedor para laNSAttributeString
función de iOS 6.En esa nota, si solo estuvieras soportando iOS 6 y iOS 7, entonces definitivamente cambiaría todo tu
NSString
sizeWithFont:...
a laNSAttributeString
boundingRectWithSize
. ¡Le ahorrará mucho dolor de cabeza si tiene un caso de esquina de múltiples hilos extraño! Así es como me convertíNSString
sizeWithFont:constrainedToSize:
:Lo que solía ser:
Se puede reemplazar con:
Tenga en cuenta que la documentación menciona:
Entonces, para extraer la altura o el ancho calculados que se usarán para dimensionar vistas, usaría:
fuente
Como puede ver
sizeWithFont
en el sitio para desarrolladores de Apple, está en desuso, por lo que debemos usarlosizeWithAttributes
.fuente
[NSObject respondsToSelector:]
método como aquí: stackoverflow.com/a/3863039/1226304Creé una categoría para manejar este problema, aquí está:
De esta manera sólo tiene que buscar / reemplazar
sizeWithFont:
consizeWithMyFont:
y usted es bueno ir.fuente
En iOS7, necesitaba la lógica para devolver la altura correcta para la vista de tabla: heightForRowAtIndexPath, pero sizeWithAttributes siempre devuelve la misma altura independientemente de la longitud de la cadena porque no sabe que se colocará en una celda de tabla de ancho fijo . ¡Encontré que esto funciona muy bien para mí y calcula la altura correcta teniendo en cuenta el ancho de la celda de la tabla! Esto se basa en la respuesta anterior del Sr. T.
fuente
Las etiquetas de varias líneas que usan altura dinámica pueden requerir información adicional para establecer el tamaño correctamente. Puede usar sizeWithAttributes con UIFont y NSParagraphStyle para especificar tanto la fuente como el modo de salto de línea.
Definiría el estilo de párrafo y usaría un NSDictionary como este:
Puede usar CGSize 'ajustadoSize' o CGRect como propiedad rect.size.height si está buscando la altura.
Más información sobre NSParagraphStyle aquí: https://developer.apple.com/library/mac/documentation/cocoa/reference/applicationkit/classes/NSParagraphStyle_Class/Reference/Reference.html
fuente
fuente
Cree una función que tome una instancia de UILabel. y devuelve CGSize
fuente
tableView.estimatedRowHeight = 68.0 tableView.rowHeight = UITableViewAutomaticDimension
Solución alternativa
fuente
Partiendo de @bitsand, este es un nuevo método que acabo de agregar a mi categoría NSString + Extras:
Solo uso el tamaño del cuadro resultante.
fuente
Aún puedes usar
sizeWithFont
. pero, en iOS> = 7.0, el método se bloquea si la cadena contiene espacios iniciales y finales o líneas finales\n
.Recortar texto antes de usarlo
Eso también puede aplicarse a
sizeWithAttributes
y[label sizeToFit]
.Además, siempre que tenga
nsstringdrawingtextstorage message sent to deallocated instance
en un dispositivo iOS 7.0 se ocupa de esto.fuente
Mejor uso de dimensiones automáticas (Swift):
NB: 1. El prototipo UITableViewCell debe estar correctamente diseñado (por ejemplo, no olvide establecer UILabel.numberOfLines = 0, etc.) 2. Eliminar el método HeightForRowAtIndexPath
VIDEO: https://youtu.be/Sz3XfCsSb6k
fuente
fuente
La respuesta aceptada en Xamarin sería (use sizeWithAttributes y UITextAttributeFont):
fuente
Como la respuesta de @Ayush:
Bueno, suponiendo que en 2019+ probablemente esté usando Swift y en
String
lugar de Objective-c yNSString
, esta es la forma correcta de obtener el tamaño de unaString
fuente predefinida:fuente
fuente
Aquí está el equivalente de monotouch si alguien lo necesita:
que se puede usar así:
fuente
fuente
Prueba esta sintaxis:
fuente
Nada de esto funcionó para mí en iOS 7. Esto es lo que terminé haciendo. Puse esto en mi clase de celda personalizada y llamo al método en mi método heightForCellAtIndexPath.
Mi celda se parece a la celda de descripción cuando veo una aplicación en la tienda de aplicaciones.
Primero en el guión gráfico, establezca su etiqueta en 'atributosTexto', establezca el número de líneas en 0 (lo que redimensionará la etiqueta automáticamente (solo ios 6+)) y configúrelo en ajuste de texto.
Luego solo agrego todas las alturas del contenido de la celda en mi Clase de celda personalizada. En mi caso, tengo una etiqueta en la parte superior que siempre dice "Descripción" (_descriptionHeadingLabel), una etiqueta más pequeña que es de tamaño variable que contiene la descripción real (_descriptionLabel) una restricción desde la parte superior de la celda hasta el encabezado (_descriptionHeadingLabelTopConstraint) . También agregué 3 para espaciar un poco la parte inferior (aproximadamente la misma cantidad que Apple coloca en la celda del tipo de subtítulo).
Y en mi delegado de Vista de tabla:
Puede cambiar la instrucción if para que sea un poco más 'inteligente' y realmente obtenga el identificador de celda de algún tipo de fuente de datos. En mi caso, las celdas estarán codificadas, ya que habrá una cantidad fija de ellas en un orden específico.
fuente
boundingRectWithSize
en ios 9.2 problemas actuales, es resultados diferentes a ios <9.2. Encontraste o conoces cualquier otra mejor manera de hacer esto.