Como criar um UITextfield multilinha?

259

Estou desenvolvendo um aplicativo em que o usuário precisa escrever algumas informações. Para este propósito, preciso de um UITextFieldque seja multi-linha (em geral UITextFieldé uma única linha).

Como estou pesquisando no Google, encontro uma resposta para usar em UITextViewvez de UITextfieldpara esse fim.

raaz
fonte
Aqui está o pequeno controle que escrevi exatamente para esse fim. possui suporte a várias linhas e também botão Concluído para fechar o teclado. sinta-se à vontade para usá-lo code.google.com/p/galtextfield
Gal Blank
2
usar este terceiro aulas importar seu projeto Xcode e usá-lo, o seu trabalho muito bom link: github.com/adonoho/HPGrowingTextView
Mahesh chowdary

Respostas:

435

UITextField é especificamente apenas uma linha.

Sua pesquisa no Google está correta, você precisa usar em UITextViewvez de UITextFieldpara exibir e editar texto de várias linhas.

No Construtor de interface, adicione o UITextViewlocal desejado e selecione a caixa "editável". Será multilinha por padrão.

h4xxr
fonte
7
Diga-me, por favor, como o aplicativo Calendário nativo faz o View com espaço reservado e quebra de linha para anotações na tela de adição de eventos?
Gennadiy Ryabkin
3
como definir um espaço reservado para UITextView?
Mani
4
Você não pode adicionar espaço reservado ao TextView, mas pode adicionar um rótulo cinza ao TextView e ocultá-lo se o usuário inserir algum texto.
Andrew Romanov
Por favor, alguém pode me ajudar com a seguinte pergunta? Se o usuário grava texto com marcadores (várias quebras de linha) no UITextView, como detectar o número total de quebras de linha?
Markus
@ Markus, você deve abrir uma nova pergunta para isso #
Nathan F.
20

Você pode falsificar um UITextField usando o UITextView. O problema é que você perde a funcionalidade do espaço reservado.

Se você optar por usar um UITextView e precisar do espaço reservado, faça o seguinte:

Em seu viewDidLoad, defina a cor e o texto como espaços reservados:

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

Em seguida, faça o espaço reservado desaparecer quando seu UITextView estiver selecionado:

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

Quando o usuário terminar de editar, verifique se há um valor. Se não houver, adicione o espaço reservado novamente:

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

Outros recursos que você pode precisar falsificar:

Geralmente, o UITextField coloca em maiúscula todas as letras; você pode adicionar esse recurso ao UITableView:

myTxtView.autocapitalizationType = .words

Normalmente, os UITextField's não rolam:

myTxtView.scrollEnabled = false
Dave G
fonte
18

Ok, eu fiz isso com algum truque;) Primeiro construa um UITextFielde aumente é sizeassim:

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

Em seguida, crie um UITextViewexatamente na mesma área que você criou o meu UITextFielde exclua o seu background color. Agora parece que você tem várias linhas TextField!

Rudi
fonte
2
Usei o layout automático e fixei todos os lados do UITextField no UITextView. Realmente ótimo truque, obrigado!
Phatmann
@phantmann, você pode nos mostrar seu código para o layout automático?
Esteve
8
Isso cria um UITextView. O objetivo de ter um UITextField é que ele se comporta de maneira diferente de um UITextView.
Nate Symer
2
Existem várias diferenças entre UITextViewe UITextfield: elas herdam de UIScrollViewvs UIControl, não editável por padrão vs. editável por padrão, multilinha vs. linha única, protocolos de delegados diferentes, não espaço reservado x espaço reservado.
Sam Ballantyne
UITextViewé para parágrafos de texto. Use-o se precisar de um parágrafo de texto, e não o contrário.
Sam Ballantyne
9

Além do comportamento de várias linhas, a principal diferença entre UITextView e UITextField é que o UITextView não propõe um espaço reservado. Para ignorar essa limitação, você pode usar um UITextView com um "espaço reservado falso".

Consulte esta pergunta SO para obter detalhes: Espaço reservado no UITextView .

MonsieurDart
fonte
2

Se você deve ter um UITextField com 2 linhas de texto, uma opção é adicionar um UILabel como uma subvisão do UITextField para a segunda linha de texto. Eu tenho um UITextField no meu aplicativo que os usuários geralmente não percebem que é editável ao tocar e eu queria adicionar um pequeno texto de legenda que diz "Toque para editar" ao 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];
DiscDev
fonte
2

Sim, um UITextView é o que você está procurando. Você terá que lidar com algumas coisas de maneira diferente (como a tecla de retorno), mas poderá adicionar texto a ela, e isso permitirá que você role para cima e para baixo se houver muito texto dentro.

Este link contém informações sobre como criar uma tela para inserir dados:

crie uma tela de entrada de dados

rei nevan
fonte
1

use UITextView em vez de UITextField

Monir Khlaf
fonte
0

Um complemento à resposta do h4xxr acima, uma maneira mais fácil de ajustar a altura do UITextField é selecionar o estilo da borda quadrada no atributo inspetores-> Campo de texto. (Por padrão, o estilo da borda de um campo UIText é elipse.)

Referência: Brian respondeu aqui: Como definir a altura do UITextField?

Tony
fonte
-1

Há outra opção que funcionou para mim:

Subclasse UITextField e substitua:

- (void)drawTextInRect:(CGRect)rect

Neste método, você pode, por exemplo:

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

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

Esse código renderizará o texto usando quantas linhas forem necessárias, se o rect tiver espaço suficiente. Você pode especificar qualquer outro atributo, dependendo de suas necessidades.

Não use:

self.defaultTextAttributes

o que forçará a renderização de texto em uma linha

McFlys
fonte