Tengo esta extraña cuestión, y trato im con él durante más de 8 horas ahora .. Dependiendo de la situación que tengo que calcular UILabels
el tamaño dinámicamente,
por ejemplo,
mi UIViewController
recibe un evento y el cambio i UILabels
tamaño. de mayor a menor. El tamaño de mi se UILabel
hace más pequeño y obtengo el tamaño correcto necesario, pero el texto en mi UILabel
permanece igual, el mismo tamaño de fuente, etc. Necesito que la fuente sea más pequeña, para que todo el texto se ajuste a UILabel
. Entonces, la pregunta es cómo hacer que el texto se ajuste a mi etiqueta autoshrinking
o algo así.
En mi xib
, UILabels
autoshrink
está marcado, también el número de líneas se establece en 0, y también mi cadena tiene nuevos símbolos de línea (\ n), y he seleccionado el modo de salto de línea a wordwrap
. ¿Quizás alguien estaba en la misma situación que yo ahora y podría ayudarme? Realmente lo agradecería.
¡Gracias por adelantado!
EDITAR: UILabel
el tamaño de fuente mínimo se establece en 10
fuente
Respuestas:
En caso de que todavía esté buscando una solución mejor, creo que esto es lo que quiere:
Un valor booleano que indica si el tamaño de la fuente debe reducirse para que la cadena del título encaje en el rectángulo delimitador de la etiqueta (esta propiedad solo es efectiva cuando la
numberOfLines
propiedad se establece en 1).Al establecer esta propiedad,
minimumScaleFactor
DEBE establecerse también (un buen valor predeterminado es 0.5).Rápido
C objetivo
Un valor booleano que indica si el espaciado entre letras debe ajustarse para que se ajuste a la cadena dentro del rectángulo de límites de la etiqueta.
Rápido
C objetivo
Fuente .
fuente
minimumFontSize
está obsoleto en iOS 6.0. Úselo en suminimumScaleFactor
lugar.Así es como obtengo el
Autoshrink
trabajo de UILabel (especialmente para la altura de la fuente de la etiqueta que se ajusta en el dispositivo 4s desde 6s Plus Storyboard) en iOS 9.2, Xcode 7.2 ...fuente
minimumFontSize
está en desuso en iOS 6.Así que usa en
minimumScaleFactor
lugar deminmimumFontSize
.Rápido 5
fuente
también mi solución es la etiqueta booleana.adjustsFontSizeToFitWidth = YES; PERO. Debe en el Builder de la interfaz el cambio de Word Wrapping a " CLIP ". Luego, encoja automáticamente las etiquetas. Esto es muy importante.
fuente
En Swift 3 (programáticamente) tuve que hacer esto:
fuente
Puedes escribir como
Puedes calcular el número de líneas así
Espero que esto te ayude :-) esperando tu respuesta
fuente
Bueno, al final no encontré mi respuesta. Y creo que el encogimiento automático no funciona para varias líneas. Terminé usando la sugerencia en este enlace: encogimiento automático en un UILabel con varias líneas
La solución es calcular la altura del texto a un ancho dado y si el texto es más grande, reducir el tamaño de la fuente y luego hacer lo mismo nuevamente hasta que la altura sea igual o menor que el tamaño necesario.
No entiendo por qué esto debería ser tan difícil de implementar. Si me falta algo, todos pueden corregirme :)
fuente
Esto es para Swift 3 con Xcode 8.2.1 (8C1002)
La mejor solución que he encontrado es establecer un ancho fijo en su Storyboard o IB en la etiqueta. Establezca sus restricciones con restricción a los márgenes. En su viewDidLoad agregue las siguientes líneas de código:
Esto funcionó de maravilla y no se desborda a una nueva línea y encoge el texto para que se ajuste al ancho de la etiqueta sin problemas extraños y funciona en Swift 3.
fuente
Es una gran pregunta, porque parece que ahora sería parte de la
UIKit
funcionalidad incorporada o un marco relacionado. Aquí hay un buen ejemplo visual de la pregunta:No hay una forma fácil de evitarlo, pero definitivamente es posible. Una forma de hacerlo es probar mediante programación diferentes tamaños de fuente hasta que encuentre una que se ajuste razonablemente cerca de los límites de la vista. Puede lograr esto con la
boundingRect()
función deNSString
oNSAttributedString
. Por ejemplo:Puede hacer una búsqueda binaria para ser más eficiente que un enfoque completo de fuerza bruta. También hay algunas consideraciones que son un poco más complicadas, incluido el ajuste correcto de palabras y el rendimiento del almacenamiento en caché de fuentes de iOS, si está buscando algo realmente sólido.
Si solo le importa mostrar el texto en la pantalla de una manera fácil, he desarrollado una implementación sólida en Swift, que también estoy usando en una aplicación de producción. Es una
UIView
subclase con escalado de fuente automático y eficiente para cualquier texto de entrada, incluidas varias líneas. Para usarlo, simplemente haría algo como:¡Eso es! Puede encontrar la fuente completa aquí: https://github.com/FlickType/AccessibilityKit
¡Espero que esto ayude!
fuente
En iOS 9 solo tenía que:
Alguien recomendó establecer el número de líneas en 0, pero para mí esto solo hizo que la etiqueta pasara a varias líneas ...
fuente
UILabel
aUITextField
en una celda estática y hacía clic en "Resolver problemas de autodiseño" y "Agregar restricciones faltantes". Todo estaba alineado, pero Autoshrink necesitaba saber la distancia a la etiqueta, para la cual "Agregar restricciones faltantes" no agregó una restricción.Creo que puede escribir el código siguiente después de alloc init Label
Está funcionando bien conmigo Úselo
fuente
Dos años después, y este problema sigue circulando ...
En iOS 8 / XCode 6.1, a veces encontraba que mi
UILabel
(creado en unUITableViewCell
, con AutoLayout activado y restricciones flexibles para que tuviera mucho espacio) no cambiaba de tamaño para ajustarse a la cadena de texto.La solución, como en años anteriores, fue configurar el texto y luego llamar
sizeToFit
.(Suspiro.)
fuente
A continuación, le indicamos cómo hacerlo: suponga que la siguiente etiqueta de mensaje es la etiqueta que desea que tenga el efecto deseado. Ahora, pruebe estas simples líneas de códigos:
fuente
no funciona si
numberOfLines > 1
lo que hice provocó una condición como esta-fuente
Llegué tarde a la fiesta, pero como tenía el requisito adicional de tener una palabra por línea, esta adición funcionó para mí:
label.numberOfLines = [labelString componentsSeparatedByString:@" "].count;
Apple Docs dice:
Pero esto es una mentira. ¡Una mentira que te digo! Es cierto para todas las versiones de iOS. Específicamente, esto es cierto cuando se usa un
UILabel
dentro de unUICollectionViewCell
para el cual el tamaño está determinado por restricciones ajustadas dinámicamente en tiempo de ejecución a través de un diseño personalizado (ej.self.menuCollectionViewLayout.itemSize = size
).Entonces, cuando se usa junto con
adjustsFontSizeToFitWidth
yminimumScaleFactor
, como se mencionó en respuestas anteriores, la configuración programáticanumberOfLines
basada en el recuento de palabras resolvió el problema de reducción automática. Hacer algo similar basado en el recuento de palabras o incluso de caracteres puede producir una solución "lo suficientemente cercana".fuente
En Swift 4 (mediante programación):
fuente
Swift 4, Xcode 9.4.1
La solución que funcionó para mí: tenía una etiqueta dentro de una celda de vista de colección y el texto de la etiqueta se estaba recortando. Establezca los atributos como se muestra a continuación en Storyboard
fuente