Tengo una vista que se presenta completamente usando el diseño automático mediante programación. Tengo un UITextView en el medio de la vista con elementos arriba y abajo. Todo funciona bien, pero quiero poder expandir UITextView a medida que se agrega texto. Esto debería empujar todo debajo de él a medida que se expande.
Sé cómo hacer esto a la manera de "resortes y puntales", pero ¿hay una forma de diseño automático para hacerlo? La única forma en que puedo pensar es eliminando y volviendo a agregar la restricción cada vez que necesita crecer.
ios
uitextview
autolayout
nslayoutconstraint
tharris
fuente
fuente
Respuestas:
AutoLayout le asignará su tamaño a la vista que contiene UITextView
setBounds
. Entonces, esto es lo que hice. La supervista inicialmente configura todas las demás restricciones como deberían ser, y al final puse una restricción especial para la altura de UITextView, y la guardé en una variable de instancia.En el
setBounds
método, luego cambié el valor de la constante.fuente
textViewDidChange
esto debería ahorrar algunas subclases de problemas y escribir código ...textViewDidChange:
no se llamará al agregar texto al UITextView mediante programación.Resumen: deshabilite el desplazamiento de su vista de texto y no restrinja su altura.
Para hacer esto mediante programación, ingrese el siguiente código
viewDidLoad
:Para hacer esto en Interface Builder, seleccione la vista de texto, desmarque Desplazamiento habilitado en el Inspector de atributos y agregue las restricciones manualmente.
Nota: Si tiene otras vistas arriba / abajo de su vista de texto, considere usar a
UIStackView
para organizarlas todas.fuente
intrinsicContentSize
esta manera- (CGSize)intrinsicContentSize { CGSize size = [super intrinsicContentSize]; if (self.text.length == 0) { size.height = UIViewNoIntrinsicMetric; } return size; }
. Dime si te está funcionando. No lo probé yo mismo.Aquí hay una solución para las personas que prefieren hacerlo todo mediante el diseño automático:
En tamaño Inspector:
Establezca la prioridad de resistencia de compresión de contenido vertical en 1000.
Reduzca la prioridad de la altura de restricción haciendo clic en "Editar" en Restricciones. Solo hazlo menos de 1000.
En el inspector de atributos:
fuente
UITextView no proporciona un tamaño de contenido intrínseco, por lo que debe subclasificarlo y proporcionar uno. Para que crezca automáticamente, invalide intrinsicContentSize en layoutSubviews. Si usa algo que no sea el contentInset predeterminado (que no recomiendo), es posible que deba ajustar el cálculo intrinsicContentSize.
fuente
setScrollEnabled:
para configurarlo siempreNO
, obtendrá un bucle infinito para un tamaño de contenido intrínseco cada vez mayor.[textView sizeToFit]
a latextViewDidChange:
devolución de llamada delegada para que Auto Layout aumentara o redujera la vista de texto (y recalculara cualquier restricción dependiente) después de cada pulsación de tecla.-(void)layoutSubviews
y envuelva todo el código-(CGSize)intrinsicContentSize
conversion >= 7.0f && version < 7.1f
+else return [super intrinsicContentSize];
Puede hacerlo a través del guión gráfico, simplemente deshabilite "Desplazamiento habilitado" :)
fuente
He descubierto que no es del todo raro en situaciones en las que aún pueda necesitar isScrollEnabled establecido en verdadero para permitir una interacción razonable de la interfaz de usuario. Un caso simple para esto es cuando desea permitir una vista de texto de expansión automática pero aún así limitar su altura máxima a algo razonable en un UITableView.
Aquí hay una subclase de UITextView que he creado que permite la expansión automática con diseño automático, pero que aún puede restringir a una altura máxima y que administrará si la vista es desplazable según la altura. Por defecto, la vista se expandirá indefinidamente si tiene sus restricciones configuradas de esa manera.
Como beneficio adicional, hay soporte para incluir texto de marcador de posición similar a UILabel.
fuente
También puedes hacerlo sin subclasificar
UITextView
. Eche un vistazo a mi respuesta a ¿Cómo dimensiono un UITextView a su contenido en iOS 7?Usa el valor de esta expresión:
para actualizar el
constant
de latextView
altura 'sUILayoutConstraint
.fuente
Una cosa importante a tener en cuenta:
Dado que UITextView es una subclase de UIScrollView, está sujeto a la propiedad automaticAdjustsScrollViewInsets de UIViewController.
Si está configurando el diseño y TextView es la primera subvista en una jerarquía UIViewControllers, tendrá sus contentInsets modificados si automaticAdjustsScrollViewInsets es verdadero, a veces causando un comportamiento inesperado en el diseño automático.
Entonces, si tiene problemas con el diseño automático y las vistas de texto, intente configurar
automaticallyAdjustsScrollViewInsets = false
el controlador de vista o mover textView hacia adelante en la jerarquía.fuente
Este es un comentario muy importante
La clave para entender por qué funciona la respuesta de vitaminwater son tres cosas:
contentOffset
es probable que nada más que:Para más información, vea objc scrollview y comprenda scrollview
Combinando los tres juntos, comprendería fácilmente que necesita permitir que el contentSize intrínseco de textView funcione junto con las restricciones de AutoLayout de textView para impulsar la lógica. Es casi como si tu textView funciona como un UILabel
Para que eso suceda, debe deshabilitar el desplazamiento, que básicamente significa el tamaño de scrollView, el tamaño de contentSize y, en caso de agregar un containerView, entonces el tamaño de containerView sería el mismo. Cuando son lo mismo, NO tienes desplazamiento. Y lo habrías hecho . Tener significa que no te has desplazado hacia abajo. ¡Ni siquiera un punto por debajo! Como resultado, la vista de texto se extenderá.
0
contentOffset
0
contentOffSet
Tampoco vale nada, lo que significa que los límites y el marco de scrollView son idénticos. Si se desplaza hacia abajo 5 puntos, entonces su contentOffset sería , mientras que su sería igual a
0
contentOffset
5
scrollView.bounds.origin.y - scrollView.frame.origin.y
5
fuente
Solución Plug and Play - Xcode 9
Autolayout al igual que
UILabel
con la detección de enlaces , selección de texto , edición y desplazamiento deUITextView
.Maneja automáticamente
Muchas de estas respuestas me dieron un 90%, pero ninguna fue infalible.
Entra en esta
UITextView
subclase y eres bueno.fuente
La respuesta de vitaminwater está funcionando para mí.
Si el texto de su vista de texto rebota hacia arriba y hacia abajo durante la edición, después de configurar
[textView setScrollEnabled:NO];
, configureSize Inspector > Scroll View > Content Insets > Never
.Espero eso ayude.
fuente
Coloque UILabel oculto debajo de su vista de texto. Etiquetar líneas = 0. Establecer restricciones de UITextView para que sean iguales a UILabel (centerX, centerY, width, height). Funciona incluso si deja el comportamiento de desplazamiento de textView.
fuente
Por cierto, construí un UITextView en expansión utilizando una subclase y anulando el tamaño del contenido intrínseco. Descubrí un error en UITextView que es posible que desee investigar en su propia implementación. Aquí está el problema:
La vista de texto desplegable crecería hacia abajo para acomodar el texto creciente si escribe letras individuales a la vez. Pero si pega un montón de texto en él, no crecerá hacia abajo, pero el texto se desplazará hacia arriba y el texto en la parte superior estará fuera de la vista.
La solución: anular setBounds: en su subclase. Por alguna razón desconocida, el pegado causó que el valor de fields.origin.y no sea zee (33 en todos los casos que vi). Por lo tanto, anulé setBounds: para establecer siempre los fields.origin.y en cero. Solucionado el problema.
fuente
Aquí hay una solución rápida:
Este problema puede ocurrir si ha establecido la propiedad clipsToBounds en false de su vista de texto. Si simplemente lo elimina, el problema desaparece.
fuente
fuente