Estoy tratando de calcular la altura de un UILabel en función de diferentes longitudes de cadena.
func calculateContentHeight() -> CGFloat{
var maxLabelSize: CGSize = CGSizeMake(frame.size.width - 48, CGFloat(9999))
var contentNSString = contentText as NSString
var expectedLabelSize = contentNSString.boundingRectWithSize(maxLabelSize, options: NSStringDrawingOptions.UsesLineFragmentOrigin, attributes: [NSFontAttributeName: UIFont.systemFontOfSize(16.0)], context: nil)
print("\(expectedLabelSize)")
return expectedLabelSize.size.height
}
Arriba está la función actual que uso para determinar la altura pero no funciona. Agradecería mucho cualquier ayuda que pueda obtener. Perfeccionaría la respuesta en Swift y no en el Objetivo C.
Respuestas:
Use una extensión en
String
Swift 3
y también en
NSAttributedString
(que a veces es muy útil)Swift 4
Simplemente cambie el valor de
attributes
en losextension String
métodosde
a
fuente
[NSFontAttributeName: font, NSLineBreakMode: .ByWordWrapping]
pero no funcionóNSParagraphStyleAttributeName : style
donde el estilo es NSMutableParagraphStylesizeForItemAtIndexPath
en unaUICollectionView
es que parece anular el retorno parainsetForSectionAt
Para texto multilínea, esta respuesta no funciona correctamente. Puede crear una extensión de cadena diferente utilizando UILabel
El UILabel obtiene un ancho fijo y .numberOfLines se establece en 0. Al agregar el texto y llamar a .sizeToFit (), se ajusta automáticamente a la altura correcta.
El código está escrito en Swift 3 🔶🐦
fuente
sizeToFit
Heres una solución simple que funciona para mí ... similar a algunos de los otros publicados, pero no incluye la necesidad de llamar
sizeToFit
Tenga en cuenta que esto está escrito en Swift 5
Esto maneja el ajuste de línea y tal. No es el código más elegante, pero hace el trabajo.
fuente
fuente
Esta es mi respuesta en Swift 4.1 y Xcode 9.4.1
Ahora llamas a esta función
fuente
Descubrí que la respuesta aceptada funcionaba para un ancho fijo, pero no para una altura fija. Para una altura fija, solo aumentaría el ancho para adaptarse a todo en una línea, a menos que haya un salto de línea en el texto.
La función de ancho llama a la función de altura varias veces, pero es un cálculo rápido y no noté problemas de rendimiento al usar la función en las filas de una UITable.
fuente
minimumTextWrapWidth:CGFloat
?Verifique la altura del texto de la etiqueta y está trabajando en ello
fuente
Esta solución ayudará a calcular la altura y el ancho en tiempo de ejecución.
Aquí puede calcular la altura estimada que tomaría su cadena y pasarla al marco UILabel.
fuente
Swift 5:
Si tiene UILabel y de alguna manera, limitingRect no funciona para usted (me enfrenté a este problema. Siempre devolvió 1 altura de línea). Hay una extensión para calcular fácilmente el tamaño de la etiqueta.
Puedes usarlo así:
Funciona para mi
fuente
fuente