Mi aplicación usa un UITextView
. Ahora quiero UITextView
que tenga un marcador de posición similar al que puede establecer para un UITextField
.
¿Como hacer esto?
ios
objective-c
cocoa-touch
uitextview
placeholder
usuario142019
fuente
fuente
UITextView
la solución se vuelve bastante diferente. Aquí hay un par de soluciones. Marcador de posición flotante y marcadores de posición nativos falsosRespuestas:
Hice algunas modificaciones menores a la solución de bcd para permitir la inicialización desde un
Xib
archivo, ajuste de texto y para mantener el color de fondo. Esperemos que ahorre a otros el problema.UIPlaceHolderTextView.h:
UIPlaceHolderTextView.m:
fuente
De manera fácil, solo cree texto de marcador de posición
UITextView
utilizando los siguientesUITextViewDelegate
métodos:solo recuerde configurar
myUITextView
con el texto exacto en la creación, por ejemploy hacer que la clase principal sea
UITextViewDelegate
antes de incluir estos métodos, por ejemploCódigo para Swift 3.1
solo recuerde configurar
myUITextView
con el texto exacto en la creación, por ejemploy hacer que la clase principal sea
UITextViewDelegate
antes de incluir estos métodos, por ejemplofuente
text
altera el atributo de la vista de texto, que es bastante agradable ... mientras que este método lo modificaNo estaba muy contento con ninguna de las soluciones publicadas, ya que eran un poco pesadas. Agregar vistas a la vista no es realmente ideal (especialmente en
drawRect:
). Ambos tenían fugas, lo cual tampoco es aceptable.Aquí está mi solución: SAMTextView
SAMTextView.h
SAMTextView.m
Es mucho más simple que los demás, ya que no usa subvistas (o tiene fugas). Sientase libre de usarlo.
Actualización 10/11/11: ahora está documentado y admite su uso en Interface Builder.
Actualización 24/11/13: apunte al nuevo repositorio.
fuente
setText
para actualizar también el marcador de posición al cambiar la propiedad de texto programáticamente: - (vacío) setText: (NSString *) string {[super setText: string]; [self_updateShouldDrawPlaceholder]; }notification
embargo, el argumento está mal escrito en el último método, y es un cambio demasiado pequeño para enviarlo como edición.Encontré una manera muy fácil de imitar un marcador de posición
Editar:
Cambió las declaraciones if para comparar etiquetas en lugar de texto. Si el usuario eliminó su texto, también fue posible eliminar accidentalmente una parte del marcador de posición
@"Foobar placeholder"
. Esto significaba que si el usuario volvía a ingresar el texto Ver el siguiente método de delegado,-(BOOL) textViewShouldBeginEditing:(UITextView *) textView
no funcionaría como se esperaba. Intenté comparar por el color del texto en la instrucción if, pero descubrí que el color gris claro configurado en el generador de interfaces no es lo mismo que el color gris claro establecido en el código con[UIColor lightGreyColor]
También es posible restablecer el texto del marcador de posición cuando vuelve el teclado y la [longitud de la vista de texto] == 0
EDITAR:
Solo para aclarar la última parte: así es cómo puede volver a configurar el texto del marcador de posición:
fuente
Lo que puede hacer es configurar la vista de texto con algún valor inicial en la
text
propiedad, y cambiartextColor
a[UIColor grayColor]
algo similar. Luego, cada vez que la vista de texto se vuelva editable, borre el texto y presente un cursor, y si el campo de texto vuelve a estar vacío, vuelva a colocar el texto del marcador de posición. Cambie el color[UIColor blackColor]
según corresponda.No es exactamente lo mismo que la funcionalidad de marcador de posición en un UITextField, pero está cerca.
fuente
Se puede establecer la etiqueta de la
UITextView
pory esconderlo
TextViewdidChange
método.Esta es la manera simple y fácil.
fuente
Si alguien necesita una solución para Swift:
Agregue UITextViewDelegate a su clase
fuente
Solución simple de Swift 3
Añadir
UITextViewDelegate
a tu claseConjunto
yourTextView.delegate = self
Crea
placeholderLabel
y posiciona dentroyourTextView
Ahora solo anima
placeholderLabel.alpha
entextViewDidChange
:es posible que tengas que jugar con la
placeholderLabel
posición para configurarlo correctamente, pero eso no debería ser demasiado difícilfuente
let alpha = CGFloat(textView.text.isEmpty ? 1.0 : 0.0) if alpha != lblPlaceholder.alpha { UIView.animate(withDuration: 0.3) { self.lblPlaceholder.alpha = alpha } }
Extendí la respuesta de KmKndy, para que el marcador de posición permanezca visible hasta que el usuario comience a editarlo en
UITextView
lugar de solo tocarlo. Esto refleja la funcionalidad en las aplicaciones de Twitter y Facebook. ¡Mi solución no requiere que subclasifique y funciona si el usuario escribe directamente o pega texto!solo recuerde configurar myUITextView con el texto exacto en la creación, por ejemplo
y haga que la clase padre sea un delegado UITextView antes de incluir estos métodos, por ejemplo
fuente
Recomiendo usar
SZTextView
.https://github.com/glaszig/SZTextView
Agregue su valor predeterminado
UITextView
destoryboard
y luego cambie su clase personalizadaSZTextView
como a continuación 👇👇👇👇Entonces verá dos nuevas opciones en el
Attribute Inspector
👇👇👇👇fuente
A continuación se muestra un puerto Swift del código ObjC "SAMTextView" publicado como una de las primeras respuestas a la pregunta. Lo probé en iOS 8. Modifiqué un par de cosas, incluido el desplazamiento de los límites para la colocación del texto del marcador de posición, ya que el original era demasiado alto y demasiado a la derecha (sugerencia utilizada en uno de los comentarios de esa publicación).
Sé que hay muchas soluciones simples, pero me gusta el enfoque de subclasificar UITextView porque es reutilizable y no tengo que saturar las clases que lo utilizan con los mecanismos.
Swift 2.2:
Swift 4.2:
fuente
así es como lo hice:
UITextView2.h
UITextView2.m
fuente
Aquí hay una solución mucho más fácil que se comporta exactamente como el marcador de posición de UITextField pero no requiere dibujar vistas personalizadas o renunciar al primer respondedor.
(la segunda verificación en la instrucción else if es para el caso en el que no se ingresa nada y el usuario presiona la tecla de retroceso)
Simplemente configure su clase como UITextViewDelegate. En viewDidLoad debes inicializar como
fuente
Hola, puede usar IQTextView disponible en IQKeyboard Manager, es fácil de usar e integrar, simplemente configure la clase de su vista de texto en IQTextView y puede usar su propiedad para establecer la etiqueta de marcador de posición con el color que desee. Puede descargar la biblioteca desde IQKeyboardManager
o puedes instalarlo desde cocoapods.
fuente
UITextViewDelegate
Lamento agregar otra respuesta, pero acabo de sacar algo como esto y esto creó el tipo de marcador de posición más cercano a UITextField.
Espero que esto ayude a alguien.
fuente
if(textView.textColor == [UIColor lightGrayColor]){ textView.textColor = [UIColor blackColor]; textView.text = [textView.text substringToIndex: 1];
De lo contrario, el primer carácter que se ingresó en la vista de texto se colocó al final del textoManera simple de usar esto dentro de una línea de código:
Tome una etiqueta hasta UITextView en .nib conectando esta etiqueta a su código, después.
fuente
He modificado la implementación de Sam Soffes para que funcione con iOS7:
Recuerde establecer
_placeholderAttribues = nil
métodos que puedan cambiar la fuente y otros signos que puedan afectarlos. También es posible que desee omitir la creación "perezosa" del diccionario de atributos si eso no lo molesta.EDITAR:
Recuerde llamar a setNeedsDisplay en una versión anulada de setBounds si desea que el marcador de posición se vea bien después de las animaciones de distribución automática y similares.
fuente
También puede crear una nueva clase TextViewWithPlaceholder como una subclase de UITextView.
(Este código es un poco tosco, pero creo que está en el camino correcto).
En su delegado, agregue esto:
fuente
Hice mi propia versión de la subclase de 'UITextView'. Me gustó la idea de Sam Soffes de usar las notificaciones, pero no me gustó el drawRect: sobrescribir. Me parece excesivo. Creo que hice una implementación muy limpia.
Puedes ver mi subclase aquí . También se incluye un proyecto de demostración.
fuente
Este hilo ha tenido muchas respuestas, pero aquí está la versión que prefiero.
Se extiende el vigente
UITextView
clase para que sea fácilmente reutilizable, y no interceptar los eventos comotextViewDidChange
(lo que podría romper el código del usuario, si ya estaban interceptando estos eventos en otros lugares).Usando mi código (que se muestra a continuación), puede agregar fácilmente un marcador de posición a cualquiera de los
UITextViews
siguientes:Cuando configura este nuevo valor de marcador de posición, agrega silenciosamente un
UILabel
encima de élUITextView
, luego lo oculta / muestra según sea necesario:De acuerdo, para realizar estos cambios, agregue un archivo "UITextViewHelper.h" que contenga este código:
... y un archivo UITextViewHelper.m que contiene esto:
Sí, es mucho código, pero una vez que lo haya agregado a su proyecto e incluido el archivo .h ...
... puedes usar marcadores de posición fácilmente
UITextViews
.Sin embargo, hay un problema.
Si haces esto:
... el marcador de posición aparecerá en la parte superior del texto. Cuando establece el
text
valor, no se llama a ninguna de las notificaciones regulares, por lo que no pude averiguar cómo llamar a mi función para decidir si mostrar / ocultar el marcador de posición.La solución es establecer el en
textValue
lugar detext
:Alternativamente, puede establecer el
text
valor y luego llamarcheckIfNeedToDisplayPlaceholder
.Me gustan soluciones como esta, ya que "llenan el vacío" entre lo que Apple nos proporciona y lo que nosotros (como desarrolladores) realmente necesitamos en nuestras aplicaciones. Escribe este código una vez, lo agrega a su biblioteca de archivos .m / .h "auxiliares" y, con el tiempo, el SDK comienza a ser menos frustrante.
(Escribí un asistente similar para agregar un botón "borrar" a mis UITextViews, otra cosa que existe molestamente
UITextField
pero no enUITextView
...)fuente
Primero tome una etiqueta en el archivo .h.
Aqui tomo
Luego, en .m debajo de viewDidLoad declararlo
textview es mi TextView.
Ahora declara
¡Y su marcador de posición Textview está listo!
fuente
Recomiendo usar el pod 'UITextView + Placeholder'
en tu código
fuente
poner una etiqueta sobre la vista de texto.
fuente
No es posible crear un marcador de posición en UITextView, pero puede generar un efecto como marcador de posición con esto.
O puede agregar una etiqueta en la vista de texto como
y establecer
fuente
Esto imita perfectamente el marcador de posición de UITextField, donde el texto del marcador de posición permanece hasta que realmente escriba algo.
fuente
Aquí hay otra forma de hacerlo, una que reproduce la pequeña sangría del
UITextField
marcador de posición:Arrastre un
UITextField
derecho debajo delUITextView
para que sus esquinas superiores izquierdas estén alineadas. Agregue su texto de marcador de posición al campo de texto.En viewDidLoad, agregue:
Luego añade:
fuente
Hagámoslo fácil
Cree un UILabel y colóquelo en su vista de texto (asigne el texto como marcador de posición, coloque gris, puede hacer todo esto en su xib) Ahora en su archivo de encabezado, declare el UILabel y también la vista de texto. Delegue ahora puede simplemente ocultar la etiqueta cuando haces clic en la vista de texto
código completo a continuación
encabezamiento
implementación
@final
No olvides conectar el textView y UILabel al propietario del archivo desde xib
fuente
Eche un vistazo a UTPlaceholderTextView .
Esta es una conveniente subclase de UITextView que admite un marcador de posición similar al de UITextField. Principales peculiaridades:
fuente
Leí todo esto, pero se me ocurrió una solución muy breve, Swift 3, que ha funcionado en todas mis pruebas. Podría soportar un poco más de generalidad, pero el proceso es simple. Aquí está todo lo que llamo "TextViewWithPlaceholder".
fuente
layoutSubviews()
directamente. Y no eliminó el observador de NotificationCenter.He escrito una clase en Swift. Puede importar esta clase cuando sea necesario.
clase pública CustomTextView: UITextView {
}
fuente