tengo un UILabel
que puede tener diferentes longitudes dependiendo de si mi aplicación se está ejecutando en modo vertical u horizontal en un iPhone o iPad. Cuando el texto es demasiado largo para mostrarse en una línea y se trunca, quiero que el usuario pueda presionarlo y obtener una ventana emergente del texto completo.
¿Cómo puedo comprobar si se UILabel
está truncando el texto? ¿Es siquiera posible? En este momento solo estoy verificando diferentes longitudes según el modo en el que estoy, pero no funciona muy bien.
UILabel
API.Respuestas:
Puede calcular el ancho de la cuerda y ver si el ancho es mayor que
label.bounds.size.width
NSString UIKit Additions tiene varios métodos para calcular el tamaño de la cadena con una fuente específica. Sin embargo, si tiene un tamaño de fuente mínimo para su etiqueta que permite que el sistema reduzca el texto a ese tamaño. Es posible que desee utilizar sizeWithFont: minFontSize: actualFontSize: forWidth: lineBreakMode: en ese caso.
fuente
numberOfLines
devuelve el número máximo de líneas utilizadas para mostrar el texto como se describe en laUILabel
referencia de la clase: developer.apple.com/library/ios/documentation/UIKit/Reference/…Swift (como extensión) - funciona para uilabel multilínea:
swift4: (parámetro
attributes
deboundingRect
cambiado ligeramente)swift3:
swift2:
fuente
EDITAR: Acabo de ver que mi respuesta fue votada a favor, pero el fragmento de código que di está obsoleto.
Ahora, la mejor manera de hacer esto es (ARC):
Tenga en cuenta que el tamaño calculado no es un valor entero. Entonces, si hace cosas como
int height = rect.size.height
estas, perderá algo de precisión de punto flotante y es posible que tenga resultados incorrectos.Respuesta anterior (obsoleta):
Si su etiqueta es multilínea, puede usar este código:
fuente
puedes hacer una categoría con UILabel
fuente
textRectForBounds:limitedToNumberOfLines:
"No debe llamar a este método directamente" ...setNeedsLayout()
layoutIfNeeded()
al comienzo del método.Utilice esta categoría para averiguar si una etiqueta está truncada en iOS 7 y superior.
fuente
Swift 3
Puede contar el número de líneas después de asignar la cadena y compararlo con el número máximo de líneas de la etiqueta.
fuente
Para agregar a la respuesta de iDev , debe usar en
intrinsicContentSize
lugar deframe
, para que funcione para Autolayoutfuente
Eso es todo. Esto funciona con
attributedText
, antes de volver a la normalidadtext
, lo que tiene mucho sentido para nosotros, las personas que tratamos con múltiples familias de fuentes, tamaños e incluso NSTextAttachments.Funciona bien con el diseño automático, pero obviamente las restricciones deben definirse y establecerse antes de que verifiquemos
isTruncated
, de lo contrario, la etiqueta en sí ni siquiera sabrá cómo distribuirse, por lo que de ninguna manera sabría si está truncada.No funciona abordar este problema con un simple
NSString
ysizeThatFits
. No estoy seguro de cómo la gente estaba obteniendo resultados positivos como ese. Por cierto, como se mencionó en numerosas ocasiones, el usosizeThatFits
no es ideal en absoluto porque tiene en cuentanumberOfLines
el tamaño resultante, lo que anula todo el propósito de lo que estamos tratando de hacer, porqueisTruncated
siempre volveríafalse
independientemente de si está truncado o no.fuente
Aquí está la respuesta seleccionada en Swift 3 (como una extensión). El OP estaba preguntando por etiquetas de 1 línea. Muchas de las respuestas rápidas que probé aquí son específicas para etiquetas de varias líneas y no se marcan correctamente en las etiquetas de una sola línea.
fuente
Esto funciona para iOS 8:
fuente
He escrito una categoría para trabajar con el truncamiento de UILabel. Funciona en iOS 7 y posterior. Espero eso ayude ! truncamiento de la cola de uilabel
fuente
Puede calcular el ancho de la cadena y ver si el ancho es mayor que el ancho de la etiqueta.
fuente
Para agregar a lo que hizo @iDev , modifiqué el
self.frame.size.height
usolabel.frame.size.height
y tampoco lo uséNSStringDrawingUsesLineFontLeading
. Después de esas modificaciones, logré un cálculo perfecto de cuándo ocurriría el truncamiento (al menos en mi caso).fuente
Tuve problemas
boundingRect(with:options:attributes:context:)
al usar el diseño automático (para establecer una altura máxima) y un texto atribuido conNSParagraph.lineSpacing
Se ignoró el espacio entre líneas (incluso cuando se pasó
attributes
alboundingRect
método) por lo que la etiqueta podría considerarse como no truncada cuando lo estaba.La solución que encontré es usar
UIView.sizeThatFits
:fuente
Debido a que todas las respuestas anteriores usan métodos depreciados, pensé que esto podría ser útil:
fuente
Para manejar iOS 6 (sí, algunos de nosotros todavía tenemos que hacerlo), aquí hay otra expansión a la respuesta de @ iDev. La conclusión clave es que, para iOS 6, para asegurarse de que el numberOfLines de su UILabel esté configurado en 0 antes de llamar a sizeThatFits; si no, le dará un resultado que dice que se necesitan "los puntos para dibujar numberOfLines de altura" para dibujar el texto de la etiqueta.
fuente
Asegúrese de llamar a cualquiera de estos en viewDidLayoutSubviews.
fuente
SWIFT 5
Ejemplo de un UILabel de múltiples líneas que está configurado para mostrar solo 3 líneas.
Aunque el usuario puede seleccionar la tecla de retorno agregando una línea adicional sin agregar al "ancho del texto", en ese caso algo como esto también puede ser útil.
fuente
Solución Swift 3
Creo que la mejor solución es (1) crear un archivo
UILabel
con las mismas propiedades que la etiqueta que está verificando para el truncamiento, (2) llamar.sizeToFit()
, (3) comparar los atributos de la etiqueta ficticia con su etiqueta real.Por ejemplo, si desea verificar si una etiqueta de una línea que tiene un ancho variable se trunca o no, puede usar esta extensión:
... pero de nuevo, puede modificar fácilmente el código anterior para adaptarlo a sus necesidades. Digamos que su etiqueta tiene varias líneas y altura variable. Entonces la extensión se vería así:
fuente
¿No sería fácil establecer el atributo de título para la etiqueta? Si lo configura, se mostrará la etiqueta completa cuando se mantenga el cursor sobre ella.
puede calcular la longitud de la etiqueta y el ancho de div (convertir a longitud - jQuery / Javascript - ¿Cómo convierto un valor de píxel (20px) a un valor numérico (20) ).
configure jquery para establecer el título si la longitud es mayor que el ancho div.
fuente