¿Cómo crear un UITextfield multilínea?


259

Estoy desarrollando una aplicación donde el usuario tiene que escribir alguna información. Para este propósito, necesito un UITextFieldque sea de varias líneas (en general UITextFieldes una sola línea).

Como estoy buscando en Google, encuentro una respuesta de usar en UITextViewlugar de UITextfieldpara este propósito.


Aquí está el pequeño control que escribí exactamente para ese propósito. Tiene soporte multilínea y también botón Listo para cerrar el teclado. siéntase libre de usarlo code.google.com/p/galtextfield
Gal Blank

2
use estas clases de terceros, importe su proyecto xcode y úselo
mahesh chowdary

Respuestas:


435

UITextField es específicamente de una sola línea.

Su búsqueda en Google es correcta, debe usarla en UITextViewlugar de UITextFieldpara mostrar y editar texto de varias líneas.

En Interface Builder, agregue un lugar UITextViewdonde lo desee y seleccione el cuadro "editable". Será multilínea por defecto.


77
Entonces, dígame, por favor, ¿cómo la aplicación de calendario nativa hace que View con marcador de posición y ajuste de texto para notas en la pantalla de agregar evento?
Gennadiy Ryabkin

3
¿Cómo establecer un marcador de posición para UITextView?
Mani

44
No puede agregar marcador de posición a TextView, pero puede agregar una etiqueta gris sobre TextView y ocultarlo si el usuario ingresa algún texto.
Andrew Romanov

Por favor, ¿alguien puede ayudarme con la siguiente pregunta? Si el usuario escribe texto con viñetas (saltos de línea múltiples) en UITextView, ¿cómo detectar el número total de saltos de línea?
Markus

@ Markus deberías abrir una nueva pregunta para eso
Nathan F.

20

Puede simular un UITextField usando UITextView. El problema que tendrá es que pierde la funcionalidad del marcador de posición.

Si elige usar un UITextView y necesita el marcador de posición, haga lo siguiente:

En su viewDidLoad establezca el color y el texto en marcadores de posición:

myTxtView.textColor = .lightGray
myTxtView.text = "Type your thoughts here..."

Luego, haga que el marcador de posición desaparezca cuando su UITextView esté seleccionado:

func textViewDidBeginEditing (textView: UITextView) {
    if myTxtView.textColor.textColor == ph_TextColor && myTxtView.isFirstResponder() {
        myTxtView.text = nil
        myTxtView.textColor = .white
    }
}

Cuando el usuario termine de editar, asegúrese de que haya un valor. Si no lo hay, agregue el marcador de posición nuevamente:

func textViewDidEndEditing (textView: UITextView) {
    if myTxtView.text.isEmpty || myTxtView.text == "" {
        myTxtView.textColor = .lightGray
        myTxtView.text = "Type your thoughts here..."
    }
}

Otras características que puede necesitar falsificar:

UITextField a menudo capitaliza cada letra, puede agregar esa característica a UITableView:

myTxtView.autocapitalizationType = .words

Los UITextField no suelen desplazarse:

myTxtView.scrollEnabled = false

18

Ok, lo hice con algún truco;) Primero construí un UITextFielde incrementado es sizeasí:

CGRect frameRect = textField.frame;
        frameRect.size.height = 53;
        textField.frame = frameRect;

Luego construya UITextViewexactamente en la misma área que hizo mi UITextField, y eliminó su background color. ¡Ahora parece que tienes varias líneas TextField!


2
Utilicé el diseño automático y fijé todos los lados del UITextField al UITextView. Muy buen truco, gracias!
phatmann

@phantmann, ¿puede mostrarnos su código para el diseño automático?
Esteve

8
Esto crea un UITextView. El punto de tener un UITextField es que se comporta de manera diferente que a UITextView.
Nate Symer

2
Hay un montón de diferencias entre UITextViewy UITextfield: heredan de UIScrollViewvs UIControl, no editable por defecto vs. editable por defecto, multilínea versus línea simple, diferentes protocolos delegados, sin marcador de posición versus marcador de posición.
Sam Ballantyne

UITextViewes para párrafos de texto. Úselo si necesita un párrafo de texto, y no de otra manera.
Sam Ballantyne

9

Además del comportamiento de varias líneas, la principal diferencia entre UITextView y UITextField es que UITextView no propone un marcador de posición. Para evitar esta limitación, puede usar un UITextView con un "marcador de posición falso".

Vea esta pregunta SO para más detalles: Marcador de posición en UITextView .


2

Si debe tener un UITextField con 2 líneas de texto, una opción es agregar un UILabel como una subvista del UITextField para la segunda línea de texto. Tengo un UITextField en mi aplicación que los usuarios a menudo no se dan cuenta de que se puede editar tocando, y quería agregar un pequeño texto de subtítulos que diga "Tap to Edit" al UITextField.

CGFloat tapLlblHeight = 10;
UILabel *tapEditLbl = [[UILabel alloc] initWithFrame:CGRectMake(20, textField.frame.size.height - tapLlblHeight - 2, 70, tapLlblHeight)];
tapEditLbl.backgroundColor = [UIColor clearColor];
tapEditLbl.textColor = [UIColor whiteColor];
tapEditLbl.text = @"Tap to Edit";

[textField addSubview:tapEditLbl];

2

Sí, un UITextView es lo que estás buscando. Tendrás que lidiar con algunas cosas de manera diferente (como la tecla de retorno), pero puedes agregarle texto y te permitirá desplazarte hacia arriba y hacia abajo si hay demasiado texto adentro.

Este enlace tiene información sobre cómo hacer una pantalla para ingresar datos:

crear una pantalla de entrada de datos



0

Un complemento a la respuesta de h4xxr en lo anterior, una forma más fácil de ajustar la altura del UITextField es seleccionar el estilo de borde cuadrado en los inspectores de atributos-> Campo de texto. (Por defecto, el estilo de borde de un UITextfield es elipse).

Referencia: Brian respondió aquí: ¿Cómo configurar la altura de UITextField?


-1

Hay otra opción que funcionó para mí:

Subclase UITextField y sobrescribir:

- (void)drawTextInRect:(CGRect)rect

En este método puedes, por ejemplo:

    NSDictionary *attributes = @{ NSFontAttributeName : self.font,
                                  NSForegroundColorAttributeName : self.textColor };

    [self.text drawInRect:verticalAlignedRect withAttributes:attributes];

Este código representará el texto utilizando tantas líneas como sea necesario si el rect tiene suficiente espacio. Puede especificar cualquier otro atributo según sus necesidades.

No utilice:

self.defaultTextAttributes

que forzará una representación de texto de una línea

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.