¿Hay una buena manera de ajustar el tamaño de un UITextViewpara que se ajuste a su contenido? Digamos, por ejemplo, que tengo un UITextViewque contiene una línea de texto:
"Hello world"
Luego agrego otra línea de texto:
"Goodbye world"
¿Hay una buena manera en Cocoa Touch para obtener el rectque contendrá todas las líneas en la vista de texto para que pueda ajustar la vista principal en consecuencia?
Como otro ejemplo, mire el campo de notas para eventos en la aplicación Calendario: observe cómo la celda (y la UITextViewque contiene) se expande para contener todas las líneas de texto en la cadena de notas.

Respuestas:
Esto funciona tanto para iOS 6.1 como para iOS 7:
O en Swift (funciona con Swift 4.1 en iOS 11)
Si desea soporte para iOS 6.1, entonces también debe:
fuente
textview.scrollEnabled = NO;para evitar que el texto se cortara incluso en iOS 7.CGFLOAT_MAXmacro en lugar deMAXFLOAT. Apropiado en ambas plataformas de 32/64 bits.Esto ya no funciona en iOS 7 o superior
En realidad, hay una manera muy fácil de cambiar el tamaño del contenido
UITextViewa su altura correcta. Se puede hacer usando elUITextViewcontentSize.Una cosa a destacar es que la correcta
contentSizesólo está disponible después de laUITextViewha sido añadido a la vista conaddSubview. Antes de eso es igual aframe.sizeEsto no funcionará si el diseño automático está activado. Con el diseño automático, el enfoque general es utilizar el
sizeThatFitsmétodo y actualizar elconstantvalor en una restricción de altura.heightConstraintes una restricción de diseño que normalmente configura a través de un IBOutlet al vincular la propiedad a la restricción de altura creada en un guión gráfico.Solo para agregar a esta increíble respuesta, 2014, si usted:
Hay una diferencia de comportamiento solo con el iPhone6 + :
Con el 6+ solamente (no el 5s o el 6) agrega "una línea en blanco más" al UITextView. La "solución RL" soluciona esto perfectamente:
Soluciona el problema de "línea extra" en 6+.
fuente
layoutIfNeededa la supervista. Entonces puedes tomar la altura desdecontentSize.Para realizar un dimensionamiento dinámico
UITextViewdentro de aUITableViewCell, encontré que la siguiente combinación funciona en Xcode 6 con el SDK de iOS 8:UITextViewa aUITableViewCelly restrinja a los ladosUITextView'sscrollEnabledpropiedad aNO. Con el desplazamiento habilitado, el marco del archivoUITextViewes independiente de su tamaño de contenido, pero con el desplazamiento deshabilitado, existe una relación entre los dos.Si su tabla utiliza la altura de fila predeterminada original de 44, calculará automáticamente las alturas de fila, pero si cambió la altura de fila predeterminada a otra, es posible que deba activar manualmente el cálculo automático de las alturas de fila en
viewDidLoad:Para dimensionamiento dinámico de solo lectura
UITextView, eso es todo. Si está permitiendo que los usuarios editen el texto en suUITextView, también necesita:Implemente el
textViewDidChange:método delUITextViewDelegateprotocolo y dígaletableViewque se repinte cada vez que se edite el texto:Y no olvide establecer el
UITextViewdelegado en algún lugar, ya sea enStoryboardo entableView:cellForRowAtIndexPath:fuente
tableView.rowHeight = UITableViewAutomaticDimensionfue innecesario.Solución de trabajo muy fácil usando código y guión gráfico.
Por código
Por Storyboard
Desmarca la opción Habilitar desplazamiento
No es necesario hacer nada aparte de esto.
fuente
Rápido:
fuente
textView.scrollEnabled = falseEn mi experiencia (limitada),
no respeta los caracteres de nueva línea, por lo que puede terminar con un formato mucho más corto de lo
CGSizeque realmente se requiere.parece respetar las nuevas líneas.
Además, el texto no se representa realmente en la parte superior de
UITextView. En mi código, configuré la nueva altura deUITextView24 píxeles más grande que la altura devuelta por lossizeOfFontmétodos.fuente
En iOS6, puede verificar la
contentSizepropiedad de UITextView justo después de configurar el texto. En iOS7, esto ya no funcionará. Si desea restaurar este comportamiento para iOS7, coloque el siguiente código en una subclase de UITextView.fuente
Publicaré la solución correcta en la parte inferior de la página en caso de que alguien sea valiente (o lo suficientemente desesperado) como para leer hasta este punto.
Aquí está el repositorio de gitHub para aquellos que no quieren leer todo ese texto: resizableTextView
Esto funciona con iOs7 (y creo que funcionará con iOs8) y con autolayout. No necesita números mágicos, deshabilite el diseño y cosas así. Solución corta y elegante.
Creo que todo el código relacionado con restricciones debería ir al
updateConstraintsmétodo. Entonces, hagamos el nuestroResizableTextView.El primer problema que encontramos aquí es que no conocemos el tamaño real del contenido antes del
viewDidLoadmétodo. Podemos tomar un camino largo y con errores y calcularlo en función del tamaño de fuente, los saltos de línea, etc. Pero necesitamos una solución robusta, así que haremos:CGSize contentSize = [self sizeThatFits:CGSizeMake(self.frame.size.width, FLT_MAX)];Así que ahora sabemos contenido real Tamaño sin importar dónde estemos: antes o después
viewDidLoad. Ahora agregue restricción de altura en textView (a través de guión gráfico o código, no importa cómo). Ajustaremos ese valor con nuestrocontentSize.height:Lo último que debe hacer es decirle a la superclase
updateConstraints.Ahora nuestra clase se ve así:
ResizableTextView.m
Bonita y limpia, ¿verdad? ¡Y no tiene que lidiar con ese código en sus controladores !
¡Pero espera! Y NO ANIMACIÓN!
Puede animar fácilmente los cambios para que se
textViewestiren suavemente. Aquí hay un ejemplo:fuente
CGFLOAT_MAX, noFLT_MAX.¿Lo intentaste
[textView sizeThatFits:textView.bounds]?Editar: sizeThatFits devuelve el tamaño pero en realidad no cambia el tamaño del componente. No estoy seguro de si eso es lo que quieres o si
[textView sizeToFit]es más lo que estabas buscando. En cualquier caso, no sé si se ajustará perfectamente al contenido que desea, pero es lo primero que debe intentar.fuente
Otro método es encontrar el tamaño que tomará una cadena particular usando el
NSStringmétodo:-(CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)sizeEsto devuelve el tamaño del rectángulo que se ajusta a la cadena dada con la fuente dada. Pase un tamaño con el ancho deseado y una altura máxima, y luego puede ver la altura devuelta para ajustarse al texto. Existe una versión que también le permite especificar el modo de salto de línea.
Luego puede usar el tamaño devuelto para cambiar el tamaño de su vista para que se ajuste.
fuente
Si no tiene a
UITextViewmano (por ejemplo, está dimensionando las celdas de la vista de tabla), tendrá que calcular el tamaño midiendo la cadena y luego teniendo en cuenta los 8 puntos de relleno a cada lado de aUITextView. Por ejemplo, si conoce el ancho deseado de su vista de texto y desea calcular la altura correspondiente:Aquí, cada 8 representa uno de los cuatro bordes acolchados, y 100000 solo sirve como un tamaño máximo muy grande.
En la práctica, es posible que desee agregar un extra
font.leadinga la altura; esto agrega una línea en blanco debajo de su texto, que puede verse mejor si hay controles visualmente pesados directamente debajo de la vista de texto.fuente
Podemos hacerlo por restricciones.
2.Cree IBOutlet para esa restricción de altura.
3.no olvide establecer delegado para su vista de texto.
4)
luego actualice su restricción así :)
fuente
Las siguientes cosas son suficientes:
UITextView:Incluso puedes usarlo
UITableViewAutomaticDimension.fuente
En combinación con la respuesta de Mike McMaster, es posible que desee hacer algo como:
fuente
¡Encontré una forma de cambiar el tamaño de la altura de un campo de texto de acuerdo con el texto dentro de él y también organizar una etiqueta debajo de él en función de la altura del campo de texto! Aquí está el código.
fuente
Chicos que usan autolayout y su sizetofit no funciona, luego verifiquen su restricción de ancho una vez. Si se había perdido la restricción de ancho, entonces la altura será precisa.
No es necesario usar ninguna otra API. solo una línea solucionaría todo el problema.
Aquí, solo me preocupaba la altura, mantener el ancho fijo y me había perdido la restricción de ancho de mi TextView en el guión gráfico.
Y esto fue para mostrar el contenido dinámico de los servicios.
Espero que esto pueda ayudar ...
fuente
A partir de iOS 8, es posible utilizar las características de diseño automático de un UITableView para cambiar automáticamente el tamaño de un UITextView sin ningún código personalizado. He puesto un proyecto en github que demuestra esto en acción, pero aquí está la clave:
rowHeightenUITableViewAutomaticDimension.fuente
Revisé todas las respuestas y todas mantienen un ancho fijo y solo ajusto la altura. Si desea ajustar también el ancho, puede usar fácilmente este método:
así que al configurar su vista de texto, configure el desplazamiento deshabilitado
y luego en el método delegado
func textViewDidChange(_ textView: UITextView)agregue este código:Salidas:
fuente
Esto funcionó bien cuando necesitaba hacer que el texto se
UITextViewajustara a un área específica:// El texto ya debe agregarse a la subvista, o contentviewsize será incorrecto. - (nulo) reduceFontToFit: (UITextView *) tv { UIFont * font = tv.font; doble pointSize = font.pointSize; while (tv.contentSize.height> tv.frame.size.height && pointSize> 7.0) { pointSize - = 1.0; UIFont * newFont = [UIFont fontWithName: font.fontName tamaño: pointSize]; tv.font = newFont; } if (pointSize! = font.pointSize) NSLog (@ "fuente hasta% .1f desde% .1f", pointSize, tv.font.pointSize); }fuente
Aquí está la versión rápida de @jhibberd
fuente
deshabilitar el desplazamiento
agregar constaints
y agrega tu texto
si lo usa
UIScrollView, debe agregar esto también;fuente
Para iOS 7.0, en lugar de configurar
frame.size.heightel usocontentSize.height(que actualmente no hace nada)[textView sizeToFit].Ver esta pregunta .
fuente
Usar UITextViewDelegate es la forma más fácil:
fuente
Espero que esto ayude:
fuente
textView.frame.si alguna otra llega aquí, esta solución funciona para mí, 1 "Ronnie Liew" +4 "user63934" (Mi texto llega del servicio web): tenga en cuenta el 1000 (nada puede ser tan grande "en mi caso")
Y eso es ... Saludos
fuente
La mejor manera que descubrí para cambiar el tamaño de la altura de UITextView de acuerdo con el tamaño del texto.
o puedes USAR
fuente
Para aquellos que desean que la vista de texto se mueva hacia arriba y mantenga la posición final
fuente
El único código que funcionará es el que usa 'SizeToFit' como en la respuesta de jhibberd anterior, pero en realidad no contestará a menos que lo llame en ViewDidAppear o lo conecte al evento de cambio de texto UITextView.
fuente
Basado en la respuesta de Nikita Took, llegué a la siguiente solución en Swift que funciona en iOS 8 con autolayout:
fuente
Respuesta rápida: El siguiente código calcula la altura de su textView.
Ahora puede establecer la altura de su textView en
myTextHeightfuente
let attribute = [NSFontAttributeName: textView.text.font!]¿Es realmente este código Swift sin errores?) ¿Quiso decirlet attribute = [NSFontAttributeName: textView.font!]