Meu aplicativo usa um UITextView
. Agora, quero UITextView
ter um espaço reservado semelhante ao que você pode definir para um UITextField
.
Como fazer isso?
ios
objective-c
cocoa-touch
uitextview
placeholder
user142019
fonte
fonte
UITextView
a solução, será bem diferente. Aqui estão algumas soluções. Marcador flutuante e marcadores nativos falsosRespostas:
Fiz algumas pequenas modificações na solução da bcd para permitir a inicialização de um
Xib
arquivo, quebra de texto e manter a cor do plano de fundo. Espero que isso poupe a outros problemas.UIPlaceHolderTextView.h:
UIPlaceHolderTextView.m:
fonte
Maneira fácil, basta criar texto de espaço reservado
UITextView
usando os seguintesUITextViewDelegate
métodos:lembre-se de definir
myUITextView
com o texto exato sobre a criação, por exemploe faça a classe pai
UITextViewDelegate
antes de incluir esses métodos, por exemploCódigo para Swift 3.1
lembre-se de definir
myUITextView
com o texto exato sobre a criação, por exemploe faça a classe pai
UITextViewDelegate
antes de incluir esses métodos, por exemplofonte
text
atributo do textview, o que é meio agradável ... enquanto esse método a modificaEu não estava muito feliz com nenhuma das soluções postadas, pois eram um pouco pesadas. Adicionar vistas à vista não é realmente ideal (especialmente em
drawRect:
). Ambos tiveram vazamentos, o que também não é aceitável.Aqui está a minha solução: SAMTextView
SAMTextView.h
SAMTextView.m
É muito mais simples que os outros, pois não usa sub-visualizações (ou apresenta vazamentos). Sinta-se livre para usá-lo.
Atualização 11/10/11: Agora está documentada e suporta o uso no Interface Builder.
Atualização 24/11/13: aponte para novo repositório .
fonte
setText
para também atualizar o espaço reservado ao alterar programaticamente a propriedade de texto: - (void) setText: (NSString *) string {[super setText: string]; [self_updateShouldDrawPlaceholder]; }notification
entanto, o argumento está incorreto no último método e é uma alteração muito pequena para ser enviada como edição.Eu achei uma maneira muito fácil de imitar um marcador de posição
Editar:
Alteradas as instruções if para comparar tags em vez de texto. Se o usuário excluiu seu texto, também foi possível excluir acidentalmente uma parte do espaço reservado
@"Foobar placeholder"
. Isso significa que se o usuário digitar novamente o textView no seguinte método delegado-(BOOL) textViewShouldBeginEditing:(UITextView *) textView
, ele não funcionará conforme o esperado. Tentei comparar pela cor do texto na instrução if, mas achei que a cor cinza claro definida no construtor de interface não é a mesma que a cor cinza claro definida no código com[UIColor lightGreyColor]
Também é possível redefinir o texto do espaço reservado quando o teclado retornar e o [textView length] == 0
EDITAR:
Apenas para tornar a última parte mais clara - eis como você pode definir o texto do espaço reservado de volta:
fonte
O que você pode fazer é configurar a exibição de texto com algum valor inicial na
text
propriedade e alterartextColor
para[UIColor grayColor]
ou algo semelhante. Em seguida, sempre que a exibição do texto se tornar editável, limpe o texto e apresente um cursor e, se o campo de texto estiver vazio novamente, coloque o texto do espaço reservado novamente. Mude a cor para[UIColor blackColor]
conforme apropriado.Não é exatamente o mesmo que a funcionalidade de espaço reservado em um UITextField, mas está próximo.
fonte
Você pode definir a etiqueta do
UITextView
pore esconda-o no
TextViewdidChange
métodoEsta é a maneira simples e fácil.
fonte
Se alguém precisar de uma solução para o Swift:
Adicione UITextViewDelegate à sua turma
fonte
Solução simples Swift 3
Adicione
UITextViewDelegate
à sua turmaConjunto
yourTextView.delegate = self
Crie
placeholderLabel
e posicione-o dentroyourTextView
Agora é só animar
placeholderLabel.alpha
ontextViewDidChange
:você pode ter que jogar com a
placeholderLabel
posição para ajustá-la da maneira certa, mas isso não deve ser muito difícilfonte
let alpha = CGFloat(textView.text.isEmpty ? 1.0 : 0.0) if alpha != lblPlaceholder.alpha { UIView.animate(withDuration: 0.3) { self.lblPlaceholder.alpha = alpha } }
Estendi a resposta do KmKndy, para que o espaço reservado permaneça visível até que o usuário comece a editar o em
UITextView
vez de apenas tocar nele. Isso reflete a funcionalidade nos aplicativos do Twitter e do Facebook. Minha solução não exige que você subclasse e funcione se o usuário digitar diretamente ou colar texto!lembre-se de definir myUITextView com o texto exato na criação, por exemplo
e torne a classe pai um delegado UITextView antes de incluir esses métodos, por exemplo
fonte
Eu recomendo usar
SZTextView
.https://github.com/glaszig/SZTextView
Adicione seu padrão
UITextView
destoryboard
e altere sua classe personalizada para aSZTextView
seguinte:Então você verá duas novas opções no
Attribute Inspector
👇👇👇👇fonte
Abaixo está uma porta Swift do código ObjC "SAMTextView" publicada como uma das primeiras respostas à pergunta. Eu testei no iOS 8. Ajustei algumas coisas, incluindo os limites de deslocamento para o posicionamento do texto do espaço reservado, pois o original era muito alto e muito à direita (sugestão usada em um dos comentários dessa publicação).
Eu sei que existem muitas soluções simples, mas eu gosto da abordagem da subclasse de UITextView porque é reutilizável e não preciso desordenar classes utilizando-a com os mecanismos.
Swift 2.2:
Swift 4.2:
fonte
foi assim que eu fiz:
UITextView2.h
UITextView2.m
fonte
Aqui está uma solução muito mais fácil que se comporta exatamente como o espaço reservado do UITextField, mas não requer desenho de vistas personalizadas ou demissão do primeiro atendedor.
(a segunda verificação na declaração else if é para o caso em que nada é inserido e o usuário pressiona backspace)
Basta definir sua classe como um UITextViewDelegate. Em viewDidLoad, você deve inicializar como
fonte
Olá, você pode usar o IQTextView disponível no IQKeyboard Manager. É simples de usar e integrar apenas a classe definida de sua exibição de texto ao IQTextView e você pode usar sua propriedade para definir a etiqueta do espaço reservado com a cor desejada. Você pode fazer o download da biblioteca no IQKeyboardManager
ou você pode instalá-lo a partir de cocoapods.
fonte
UITextViewDelegate
funcionou muito bemDesculpe por adicionar outra resposta, mas acabei de criar algo assim e isso criou o tipo de espaço reservado mais próximo ao UITextField.
Espero que isso ajude alguém.
fonte
if(textView.textColor == [UIColor lightGrayColor]){ textView.textColor = [UIColor blackColor]; textView.text = [textView.text substringToIndex: 1];
Caso contrário, o primeiro caractere inserido na visualização de texto foi colocado no final do textoManeira simples de usar isso em alguma linha de código:
Pegue um rótulo até UITextView em .nib conectando esse rótulo ao seu código, depois dele.
fonte
Modifiquei a implementação de Sam Soffes para funcionar com o iOS7:
Lembre-se de definir
_placeholderAttribues = nil
métodos que possam alterar a fonte e outras formas que possam afetá-los. Você também pode pular a criação "preguiçosa" do dicionário de atributos, se isso não o incomodar.EDITAR:
Lembre-se de chamar setNeedsDisplay em uma versão substituída de setBounds, se você quiser que o espaço reservado fique bonito após as animações de layout automático e similares.
fonte
Você também pode criar uma nova classe TextViewWithPlaceholder como uma subclasse de UITextView.
(Esse código é meio difícil - mas acho que está no caminho certo.)
Em seu delegado, adicione isto:
fonte
Eu fiz minha própria versão da subclasse de 'UITextView'. Gostei da idéia de Sam Soffes de usar as notificações, mas não gostei da substituição do drawRect:. Parece um exagero para mim. Eu acho que fiz uma implementação muito limpa.
Você pode olhar para a minha subclasse aqui . Um projeto de demonstração também está incluído.
fonte
Este tópico teve muitas respostas, mas aqui está a versão que eu prefiro.
Ele estende a
UITextView
classe existente para que seja facilmente reutilizável e não intercepta eventos comotextViewDidChange
(o que pode interromper o código do usuário, se eles já estiverem interceptando esses eventos em outro lugar).Usando o meu código (mostrado abaixo), você pode adicionar facilmente um espaço reservado a qualquer um
UITextViews
desses:Quando você define esse novo valor de espaço reservado, ele adiciona discretamente um valor
UILabel
em cima do seuUITextView
e oculta / mostra conforme necessário:Ok, para fazer essas alterações, adicione um arquivo "UITextViewHelper.h" que contém este código:
... e um arquivo UITextViewHelper.m contendo este:
Sim, é muito código, mas depois de adicioná-lo ao seu projeto e incluir o arquivo .h ...
... você pode facilmente usar espaços reservados em
UITextViews
.Há uma pegadinha embora.
Se você fizer isto:
... o espaço reservado aparecerá na parte superior do texto. Quando você define o
text
valor, nenhuma das notificações regulares é chamada, então não pude descobrir como chamar minha função para decidir se mostraria / ocultaria o espaço reservado.A solução é definir o em
textValue
vez detext
:Como alternativa, você pode definir o
text
valor e ligarcheckIfNeedToDisplayPlaceholder
.Gosto de soluções como essa, pois elas "preenchem a lacuna" entre o que a Apple nos fornece e o que nós (como desenvolvedores) realmente precisamos em nossos aplicativos. Você escreve esse código uma vez, adicione-o à sua biblioteca de arquivos "helper" .m / .h e, com o tempo, o SDK começa a ficar menos frustrante.
(Eu escrevi um ajudante semelhante para adicionar um botão "limpar" ao meu UITextViews, outra coisa que existe irritantemente,
UITextField
mas não emUITextView
...)fonte
Primeiro, pegue um rótulo no arquivo .h.
Aqui eu tomo
Em .m, em viewDidLoad, declare-o
textview é o meu TextView.
Agora declare
E seu espaço reservado para o Textview está pronto!
fonte
Eu recomendo usar o pod 'UITextView + Placeholder'
no seu código
fonte
coloque um rótulo sobre a visualização de texto.
fonte
Não é possível criar espaço reservado no UITextView, mas você pode gerar efeito como espaço reservado com isso.
OU você pode adicionar um marcador na visualização de texto, assim como
E definir
fonte
Isso imita perfeitamente o espaço reservado do UITextField, onde o texto do espaço reservado permanece até você digitar algo.
fonte
Aqui está mais uma maneira de fazer isso, uma que reproduz o pequeno recuo do
UITextField
espaço reservado de:Arraste uma
UITextField
direita abaixo doUITextView
para que seus cantos superiores esquerdo estejam alinhados. Adicione o texto do seu espaço reservado ao campo de texto.Em viewDidLoad, adicione:
Adicione então:
fonte
Vamos facilitar
Crie um UILabel e coloque-o em sua exibição de texto (dê o texto como cor definida pelo espaço reservado cinza - você pode fazer tudo isso no seu xib) Agora, no arquivo de cabeçalho, declare o UILabel e também o textviewDelegate Agora você pode simplesmente ocultar o rótulo quando você clica na visualização de texto
código completo abaixo
cabeçalho
implementação
@fim
Não se esqueça de conectar o textView e o UILabel ao proprietário de arquivos do xib
fonte
Dê uma olhada no UTPlaceholderTextView .
Essa é uma subclasse conveniente do UITextView que suporta espaço reservado semelhante ao do UITextField. Principais peculiaridades:
fonte
Eu li tudo isso, mas criei uma solução muito rápida, Swift 3, que funcionou em todos os meus testes. Poderia ter um pouco mais de generalidade, mas o processo é simples. Aqui está a coisa toda que eu chamo de "TextViewWithPlaceholder".
fonte
layoutSubviews()
diretamente. E você não removeu o observador do NotificationCenter.Eu escrevi uma aula rapidamente. Você pode importar esta classe sempre que necessário.
classe pública CustomTextView: UITextView {
}
fonte